Skip to main content

白話價格表示與精度

幣圈中的價格表示法:如何理解 ETH/USD 與 ETH/BTC?

在區塊鏈與加密貨幣的世界中,價格表示法是非常常見的,例如:

binance:

pyth oracle:

  • ETH/USD
  • ETH/BTC

這些表示法的理解可能會造成一些混淆,尤其是那個「斜線(/)」的含義。如果把它誤讀為數學中的除號,可能會讓你以為是「每一顆 USD 值多少 ETH」,但這是錯的。

正確的解讀方式:

  • 請把「/」讀作「以…計價」。
  • ETH/USD 的意思是:「ETH 以 USD 計價」。
  • 如果 ETH/USD = 3000,表示每 1 顆 ETH 的價值為 3000 USD。

計價的邏輯:分數運算

這種計價方式可以像分數一樣進行運算,特別是在處理不同資產之間的兌換價值時非常有用。

範例 1:價格的乘法

假設:

  • ETH/BTC = 0.05(1 顆 ETH 等於 0.05 顆 BTC)。
  • BTC/USD = 20000(1 顆 BTC 等於 20000 USD)。

如果我們想知道 1 顆 ETH 的價值是多少 USD,公式如下:

ETH/USD=(ETH/BTC)×(BTC/USD)\text{ETH/USD} = (\text{ETH/BTC}) \times (\text{BTC/USD})

將數值代入:

ETH/USD=0.05×20000=1000\text{ETH/USD} = 0.05 \times 20000 = 1000

結論:1 顆 ETH 等於 1000 USD。

範例 2:價格的除法

假設:

  • ETH/USD = 3000(1 顆 ETH 等於 3000 USD)。
  • BTC/USD = 20000(1 顆 BTC 等於 20000 USD)。

如果我們想知道 1 顆 ETH 的價值是多少 BTC,公式如下:

ETH/BTC=ETH/USDBTC/USD\text{ETH/BTC} = \frac{\text{ETH/USD}}{\text{BTC/USD}}

將數值代入:

ETH/BTC=300020000=0.15\text{ETH/BTC} = \frac{3000}{20000} = 0.15

結論:1 顆 ETH 等於 0.15 顆 BTC。

加密貨幣的最小單位與計價的精度

在加密貨幣中,我們平時說的「1 顆 ETH」,其實是 1e18 個最小單位(wei)。類似地,「1 USDC」其實是 1e6 個最小單位。

在進行跨資產計算時,這些最小單位的差異會帶來額外的處理需求。例如:

  • 假設我們要計算最小單位的 ETH 對最小單位的 BTC 價格。
  • ETH/BTC = 0.05(1 顆 ETH 等於 0.05 顆 BTC)。
  • ETH 的精度是 18 位(1 ETH = 1e18 wei)。
  • BTC 的精度是 8 位(1 BTC = 1e8 satoshi)。

我們需要將計算結果轉換為最小單位的比例:

最小單位的 ETH/BTC=ETH/BTC×1e81e18\text{最小單位的 ETH/BTC} = \text{ETH/BTC} \times \frac{1e8}{1e18}

代入數值:

最小單位的 ETH/BTC=0.05×1e81e18=5×1013\text{最小單位的 ETH/BTC} = 0.05 \times \frac{1e8}{1e18} = 5 \times 10^{-13}

引入 Scale Factor 解決小數問題

在上述計算中,結果可能會是一個非常小的數(如 5e-13),這在 Solidity 或其他整數運算環境中是無法直接表示的。為了解決這個問題,我們引入一個 放大倍數(Scale Factor)。

Scale Factor 的作用

Scale Factor 是一個用來放大計算結果的小數的數字,以便在整數環境中處理。假設我們選擇 scale factor = 1e36,則上述公式變為:

放大後的最小單位 ETH/BTC=0.05×1e81e18×1e36\text{放大後的最小單位 ETH/BTC} = 0.05 \times \frac{1e8}{1e18} \times 1e36

代入數值:

放大後的最小單位 ETH/BTC=5×1013×1e36=5e23\text{放大後的最小單位 ETH/BTC} = 5 \times 10^{-13} \times 1e36 = 5e23

結果 5e23 是一個整數,這樣我們就可以在 Solidity 中安全地表示和計算了。

用例示範:實際應用 Scale Factor

假設:

  1. 我們希望用 Chainlink 提供的 ETH/USD 與 BTC/USD Feed 計算 ETH/BTC 的價格。

  2. 計算公式:ETH/BTC=ETH/USDBTC/USD\text{ETH/BTC} = \frac{\text{ETH/USD}}{\text{BTC/USD}}

  3. 引入 Scale Factor: scale factor = 1e36,用來提升精度。

代入數值,假設:

  • ETH/USD = 3000
  • BTC/USD = 20000

代入公式並考慮 Scale Factor:

ETH/BTC 放大後=300020000×1e36=0.15×1e36=1.5e35\text{ETH/BTC 放大後} = \frac{3000}{20000} \times 1e36 = 0.15 \times 1e36 = 1.5e35

結論:放大後的 ETH/BTC 價格為 1.5e35,可在智能合約中表示,後續如果需要結果恢復到正常單位,只需再除以 scale factor。

選擇 Scale Factor 的注意事項

  1. 放大倍數的大小決定了結果能保留多少位小數。例如:
  • 若使用 1e18,可以保留 18 位小數。
  • 若使用 1e36,可以保留 36 位小數。
  1. 放大倍數過大可能導致中間計算結果超出 uint256 的範圍。
  • Solidity 的整數是固定長度的(如 uint256 的最大值約為 1.15e77)
  • 如果需要多步乘法或除法操作,放大倍數的選擇必須考慮中間結果可能的數值範圍。
    • 放大倍數為 1e36 時,連乘兩次後結果可能是 1e72,這接近 uint256 的上限。
  1. 放大倍數需要在所有使用到的地方都是一致的數值。

總結

理解這些應該對於閱讀智能合約會有一定程度的幫助。