Gwei 换算器
在三个输入框中的任意一个输入数值,另外两个会自动跟随更新。每次换算都以 wei 形式的 BigInt 为基础,因此全部 18 位小数都能完整保留,不会被浮点数运算抹平。
最小的单位,也是 EVM 唯一实际运算所用的单位。余额、交易金额和 gas 价格在协议层面都是以 wei 计的整数;wei 之下没有更小的单位,因此协议层面不存在舍入问题。
109 wei,也写作 nanoether。gas 价格通常落在这个区间,这正是这个单位被日常使用的原因:20 Gwei 比 20000000000 wei 或 0.00000002 ETH 更易读。
1018 wei。用户在钱包里看到的单位,但几乎没有界面会真的用它来做计算。
通过 API 读取实时 gas 价格
7 天免费试用,无需信用卡,无需 KYC。
三种单位,以及它们之间的换算
以太坊只有一种货币,却有好几种表示尺度的名称。其中两种在实际使用中最重要:
| 单位 | 以 wei 计 | 以 ETH 计 | 别名 |
|---|---|---|---|
| wei | 1 | 0.000000000000000001 | —— |
| Gwei | 1,000,000,000 | 0.000000001 | nanoether、shannon |
| ETH | 1,000,000,000,000,000,000 | 1 | ether |
换算只是移动小数点,不需要用到什么库。从 Gwei 换算到 ETH 要把小数点向左移九位,从 ETH 换算到 wei 则要向右移十八位。手工换算正是出错的地方:九个零和十八个零乍看很像,一次差了三位的失误就能把 20 Gwei 的 gas 价格变成 20 兆 wei(megawei)。
为什么会有 Gwei 这个单位
EVM 没有小数类型。余额、交易金额和 gas 价格全部是以 wei 为单位的无符号整数,因为整数是共识机制唯一能够精确达成一致的东西。这个设计决定是正确的,但它也让 gas 价格变得难以阅读:一个正常的价格,用 wei 表示是十到十一位数,用 ETH 表示则是一个五位小数。这两种尺度都不适合这个数字。
Gwei 正好介于两者之间,等于 109 wei,gas 价格换算成 Gwei 后落在一到两位数区间。这就是这个单位被日常使用的全部原因。它不是独立的代币,也不是某个二层网络的计价单位,只是恰好与人们平时报出的数字大小相匹配的一种尺度。shannon 和 nanoether 这两个名称指的是同一样东西,除了在单位对照表里,几乎不会出现在别处。
反过来,同样的逻辑也适用于余额。没有人会用 wei 报出一个钱包的余额,也没有人会用 ETH 报出一个 gas 价格。每种尺度都用在能让数字位数保持可读的地方,这也是为什么一个同时涉及两者的界面要不断在它们之间来回换算。
为什么这个换算器使用 BigInt
JavaScript 的 number 类型是双精度浮点数,只有在整数不超过 253 − 1(即 9,007,199,254,740,991)时才是精确的。这大约是 9 × 1015,比一个 ETH 所含的 1018 wei 要小得多。超出这个界限后,结果不会报错,而是悄悄地变得不准确:
1.1 * 1e18 // 1100000000000000100 —— 多出了 100 wei
Number("1234567890123456789")
// 1234567890123456800 —— 丢失了最后两位
0.1 + 0.2 // 0.30000000000000004
以上这些都不会抛出错误。它们返回的是一个看起来合理的数字,只是低位数字被替换成了二进制表示恰好落在的那个值。在一个换算器里,这样的结果很糟糕;在构造交易金额的代码里,这就是一个要等到生产环境才会发现的 bug——实际转出的金额和界面上显示的金额略有出入。
解决办法是:永远不要让一个 wei 数值变成浮点数。本页把你输入的内容当作十进制字符串来解析,通过字符串操作移动小数点,并把结果保存为 BigInt。在 ETH 输入框里输入任意 18 位小数,wei 输入框会返回一模一样的数字。唯一会丢失数字的情况,是你输入的小数位数超过了该单位所能表示的位数,此时页面会明确告知,而不是悄悄四舍五入。
同样的原则也适用于你自己的代码。ethers 提供了 parseEther 和 formatUnits,viem 提供了 parseEther 和 formatGwei,两者出于同样的原因都返回 BigInt 值。自己手写的 value / 1e18 在数值达到某个量级之前都能正常工作,之后就不行了。
用三种单位表示的 gas 成本
gas 正是这种换算真正派上用场的地方,所以不妨用同一次计算,把三种尺度都过一遍。一笔普通的 ETH 转账固定消耗 21,000 gas。以 20 Gwei 的 gas 价格计算:
21000 gas × 20 Gwei = 420,000 Gwei
= 420,000,000,000,000 wei
= 0.00042 ETH
gas 用量取决于这笔交易做了什么;gas 价格取决于当时对区块空间的需求。自 EIP-1559 以来,价格被拆分为两部分:会被销毁的基础费用(base fee),以及归区块提议者所有的优先费用(priority fee)。两者都是按每单位 gas 计价,底层都是 wei 数值,这也是为什么 Chaingateway 的交易参数 gasprice、maxFeePerGas 和 maxPriorityFeePerGas 给出的示例值是 1000000000 而不是 1。那正是用 wei 写出的一个 Gwei。
读取返回的价格时要留意单位:GET /api/v2/ethereum/gasprice 返回单个 gasPrice 字段,文档中给出的示例值是 12.28,这是一个 Gwei 尺度的数字,而不是一个 wei 整数。如果直接把它原样作为交易里的 gasprice 传回去,等于是在请求每单位 gas 只出 12 wei。应先换算,再乘以你这笔交易实际使用的 gas 量。
以太坊其余的接口,包括 ERC-20 转账和交易 Webhook,见 以太坊 API 页面。相关计算器汇总在 工具页面下。
常见问题
1 ETH 等于多少 wei?
10^18,也就是 1,000,000,000,000,000,000 wei。这个指数由协议固定,从未改变过。
1 Gwei 等于多少 wei?
10^9,也就是 1,000,000,000 wei。1 ETH 等于 10^9 Gwei,所以在对数尺度上,Gwei 正好位于 wei 和 ETH 的中间。
如何手动把 wei 换算成 ETH?
把小数点向左移动十八位,如果数字位数不足十九位就用零补齐。420,000,000,000,000 wei 就变成 0.00042 ETH。Gwei 换算成 ETH 是同样的操作,只是移动九位。
Gwei 和 nanoether 是一回事吗?
是的。Gwei、nanoether 和 shannon 是同一个单位的三种叫法,都等于 10^9 wei,也就是 10^-9 ETH。Gwei 是流传下来的名字,因为 gas 价格通常都用它来报价。
为什么 gas 价格用 Gwei 而不是 ETH 来表示?
是位数的问题。20 Gwei 的 gas 价格等于 20,000,000,000 wei,或者 0.00000002 ETH,这两种写法都很难一眼看懂。用 Gwei 表示,常见的 gas 价格就能落在一到两位数之间。
我能用普通的 JavaScript 数字来做 wei 到 ETH 的换算吗?
不太可靠。双精度浮点数只能精确表示到 9,007,199,254,740,991 的整数,远小于 1 ETH 对应的 10^18 wei,所以更大的数值会在不报任何错误的情况下丢失低位数字。1.1 * 1e18 的结果是 1100000000000000100,偏差了一百 wei。应该使用 BigInt,或者返回 BigInt 的库。
如果 gas 价格用 Gwei 表示,一笔交易的 ETH 成本怎么算?
用消耗的 gas 数量乘以 gas 价格,再进行单位换算。一笔普通转账消耗 21,000 gas,按 20 Gwei 计算就是 420,000 Gwei,也就是 0.00042 ETH。合约调用消耗的 gas 更多,21,000 只是一个下限,而不是典型值。
这个换算器会四舍五入吗?
不会。每个数值都会被解析为十进制字符串,并以 wei 为单位存储为 BigInt,因此全部 18 位小数都会保留。唯一会丢失数字的情况,是输入的小数位数超过了该单位所能表示的范围,比如在 wei 输入框里写了带小数的数字,这种情况下页面会明确提示,而不是悄悄四舍五入。