白話價格表示與精度
幣圈中的價格表示法:如何理解 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,公式如下:
將數值代入:
結論:1 顆 ETH 等於 1000 USD。
範例 2:價格的除法
假設:
- ETH/USD = 3000(1 顆 ETH 等於 3000 USD)。
- BTC/USD = 20000(1 顆 BTC 等於 20000 USD)。
如果我們想知道 1 顆 ETH 的價值是多少 BTC,公式如下:
將數值代入:
結論: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)。
我們需要將計算結果轉換為最小單位的比例:
代入數值:
引入 Scale Factor 解決小數問題
在上述計算中,結果可能會是一個非常小的數(如 5e-13),這在 Solidity 或其他整數運算環境中是無法直接表示的。為了解決這個問題,我們引入一個 放大倍數(Scale Factor)。
Scale Factor 的作用
Scale Factor 是一個用來放大計算結果的小數的數字,以便在整數環境中處理。假設我們選擇 scale factor = 1e36,則上述公式變為:
代入數值:
結果 5e23 是一個整數,這樣我們就可以在 Solidity 中安全地表示和計算了。
用例示範:實際應用 Scale Factor
假設:
-
我們希望用 Chainlink 提供的 ETH/USD 與 BTC/USD Feed 計算 ETH/BTC 的價格。
-
計算公式:
-
引入 Scale Factor: scale factor = 1e36,用來提升精度。
代入數值,假設:
- ETH/USD = 3000
- BTC/USD = 20000
代入公式並考慮 Scale Factor:
結論:放大後的 ETH/BTC 價格為 1.5e35,可在智能合約中表示,後續如果需要結果恢復到正常單位,只需再除以 scale factor。
選擇 Scale Factor 的注意事項
- 放大倍數的大小決定了結果能保留多少位小數。例如:
- 若使用 1e18,可以保留 18 位小數。
- 若使用 1e36,可以保留 36 位小數。
- 放大倍數過大可能導致中間計算結果超出 uint256 的範圍。
- Solidity 的整數是固定長度的(如 uint256 的最大值約為 1.15e77)
- 如果需要多步乘法或除法操作,放大倍數的選擇必須考慮中間結果可能的數值範圍。
- 放大倍數為 1e36 時,連乘兩次後結果可能是 1e72,這接近 uint256 的上限。
- 放大倍數需要在所有使用到的地方都是一致的數值。
總結
理解這些應該對於閱讀智能合約會有一定程度的幫助。