Satoshi,简称 sat,是 比特币 的一亿分之一:1 sat = 0.00000001 BTC。它是 Bitcoin 基础层交易所记录的最小价值单位,并不是另一种加密货币。同一金额既能写成 BTC,也能写成整数个 satoshi,就像同一长度可以用米或厘米表示。
Anna 要支付 25000 sat,钱包却显示 0.00025 BTC。这不是两种货币,也不是换到了更优惠的汇率,而是同一金额的两种写法。固定关系是 1 BTC = 100000000 sat,因此 0.001 BTC = 100000 sat。日常小额支付用 sats 表示,往往比数小数点后的一串零更直观。比特币 对人民币或美元的汇率会变,但 BTC 与 sat 之间的换算不会随之改变。 [1] [2]
Anna 在设置中选择 sats 后,她的 比特币 没有移到别处,也没有新增币。改变的只是屏幕上的数字和单位。sat 是单位缩写,sats 常用作复数。这个名字是为了纪念 Bitcoin 的创造者 Satoshi Nakamoto,并不表示需要另外购买的资产。较小单位方便表达小额金额,但不保证购买力稳定,也不保证获利。 [2]
假设 Anna 的钱包使用之前收到的 50000 sat,给收款人发送 25000 sat,给 Anna 找回 24000 sat,留下 1000 sat 作为将交易打包进区块的矿工的手续费。数目正好相等:50000 = 25000 + 24000 + 1000。所以 Anna 为这笔付款花掉的是 26000 sat,不是使用的全部入账金额。这只是说明性例子,并非通常或推荐的手续费。确认前,应分别查看收款金额和手续费。 [8]
钱包除了手续费,还可能显示 Fee Rate,即以 sat/vB 表示的费率。它指每个虚拟字节对应多少 satoshi;虚拟字节是计算交易手续费时使用的大小单位。交易大小为 100 vB、费率为 10 sat/vB 时,手续费就是 1000 sat。费率不是转账金额的百分比。两笔等额付款也可能大小不同,例如其中一笔需要合并更多此前的收款。因此,应在钱包的最终确认页检查实际结果。 [7] [8]
只有数字是不够的。在 sats 输入框填入 25000,与在 BTC 输入框填入它,含义完全不同。扫描付款二维码后,签名前应检查地址、网络、金额和手续费。签名相当于花费资金的数字授权。钱包用私钥生成签名;私钥是一种秘密数值,使持有者能够控制相应的比特币。按照 BIP 321 这份付款链接规范,付款链接中的 amount 参数使用十进制 BTC,并以点号分隔小数:amount=0.00025 表示 25000 sat。即便钱包向用户显示 sats,或使用本地的小数逗号,链接中的规则也不变。无需手动修改链接;重要的是确认页上的结果正确。 [3]
网络里没有代表每个 satoshi 的小文件。它记录的是交易输出,其中有金额和花费条件。尚未花费的输出称为 UTXO。钱包可能持有多笔这样的收款,并把它们的价值加总为余额。付款时,钱包会完整花费选中的输出,再为收款人和可能的找零建立新输出。Satoshi 是计算这些价值的单位,不是放在钱包里的独立物件。 [2]
金额的精度和实际付款多大才合适,是两回事。输出可以包含 1 sat,但节点仍可能拒绝转发创建了过小输出的交易。节点就是负责验证和传递交易的计算机。Dust 涉及节点的交易转发规则,以及将来花费这个输出的估算成本。门槛还取决于输出类型和规则设置。它不是要求每笔有效支付都达到同一最低金额的普遍规则。即使一个小输出已经进入区块,花费它的成本也可能高于它的价值。 [7]
Lightning Network 使用支付通道,参与者在通道内更新已投入资金的分配。因此,无需把每笔支付都单独记入 Bitcoin 区块。其内部计算还使用 millisatoshi,简称 msat:1 sat = 1000 msat。例如,手续费可以据此算得更细。但这不会在 Bitcoin 基础层产生含有小数个 satoshi 的输出。关闭通道时,Lightning 按规则把金额转换为整数个 satoshi,并省去部分过小的输出。更精细的内部记账与最终结算,是两回事。 [6] [5]
把一个 BTC 分成一亿份,并不会增加 比特币 的数量,就像把米换算成厘米不会把桌子变长。新 比特币 按区块补贴规则产生,区块补贴就是与区块相关的新发行量。每次 Halving 都将补贴以整数个 satoshi 减半,小数部分舍去,直到遥远的未来结果变为零。技术常量 MAX_MONEY 用于检查金额范围,本身不表示恰好会有 2100 万 BTC 被发行且可供花费。丢失的密钥,以及一些无法使用或未领取的奖励,也会减少可用数量。 [1] [8]
Bitcoin Core 用 CAmount 这一 64 位整数类型表示金额,COIN 常量的值为 100000000。因此,0.00025 BTC 在内部按整数 25000 处理。这样有助于避免普通二进制浮点运算,也就是 floating point,带来的精度问题。对用户而言,结论很简单:核对单位和准确金额。如果编写计算器或在程序中处理支付,应使用整数个 satoshi 或精确十进制运算,不要在得到近似结果后再补做四舍五入。 [1]
要获得更完整的理解,请将本词条与以下词条结合阅读: Bitcoin, 21 Million, Unit of Account, Lightning Network, UTXO, Transaction Fees. 反向关联还来自: 比特币披萨日, Chaumian eCash, Blind Signature, OP_CHECKTEMPLATEVERIFY.