# Space and Time博客 | Space and Time的無限精度

By [0xKC](https://paragraph.com/@1886) · 2023-06-12

---

### 精度是什麼以及我們如何建構它

在建立一個Web3原生的數據倉庫時，面臨的一個挑戰是需要極大的數值範圍和精度。我們已經見證到在燃氣費用、燃氣限制、代幣獎勵等方面需要使用72位數或以上的數值範圍和精度。傳統的數據倉庫，如Oracle或Snowflake，使用的是最多37位數的十進制數據類型，而對於更大的數字則使用浮點數據類型。然而，浮點數據類型的挑戰在於缺乏精確度，這在Web3中會導致在聚合各方之間的價值轉移時缺乏保真度。另一種方法是一些Web3數據提供商將這些非常大的數字存儲在像VarChar這樣的字符字段中，但這會牺牲基本的數學功能。用戶只能在完整精度的數字和能夠執行基本計算之間做出選擇。

為了支持高保真度的Web3應用案例，Space and Time建立了Big Decimal數據類型，以支持Web3所需的極大數值範圍和精度，同時保留了數學功能。

### 如何運作?

Space and Time從多個端點接收區塊鏈數據，然後將其發送到Kafka主題，數據倉庫即時消費數據並將其寫入表中。另外，我們建立了一個ETL過程，將歷史區塊鏈數據批量加載到數據倉庫中。這使用戶可以訪問從第一個區塊開始的所有數據，並且能夠實時添加到鏈中的數據。我們致力於保持區塊鏈事件和該數據在Space and Time中反映的延遲盡可能低。

我們將區塊鏈數據不是以JSON類似的模式存儲，而是將其納入特定的結構化模式中，以便開發人員更容易處理數據。開發人員可以更輕鬆地在我們的關聯模式上編寫應用程序和查詢，而不是簡單的JSON數據塊。

由於Space and Time是一個HTAP（混合事務/分析處理）數據倉庫，它由兩個不同的查詢引擎組成：OLTP（事務型、基於行的）引擎和OLAP（分析型、基於列的）引擎。從用戶的角度來看，沒有分叉，只需運行查詢並獲取結果。Space and Time在驗證器層處理到適當引擎的路由。當用戶運行事務型查詢時，它從行格式數據庫中提供，具有極低的延遲。如果查詢路由器確定用戶運行了分析型查詢，則它從OLAP引擎中提供服務，該引擎使用列存儲格式，以實現更快的查詢響應時間和存儲和查詢引擎之間的數據傳輸量減少。

在構建我們的區塊鏈索引服務時，我們意識到區塊鏈數據（特別是財務數據，如錢包余額）可以具有高達78位的精度。雖然我們的OLTP引擎原生支持這種精度，但OLAP引擎不支持超過38位的精度和18位的規模。儘管數據以字符串格式存儲，但無法在這類數據上進行計算（即使是基本的數學運算，如加法和減法）而不失去精度。基於這個原因，我們創建了Big Decimal數據類型，它支持無限精度，使用戶能夠以不失去精度的方式處理區塊鏈數據。

### 如何使用?

#### 要建立一個包含小數欄位的表格，用於存儲小數值：

    Create table ETH.FUNGIBLETOKEN_WALLET(key integer, balance decimal(78, 10))
    

上面的balance字段可以包含精度（總位數）為78的十進制值。小數位數為10，這意味著小數點後可以有10個數字。

要在表格中建立具有十進制欄位的表格，您可以使用DECIMAL資料類型並設定精度和小數位數。：

    Create table ETH.FUNGIBLETOKEN_WALLET(key integer, balance decimal(78, 0))
    

請注意上面的小數位數（scale）設為0。這將使我們能夠在欄位中儲存整數。您可以根據需要任意定義小數位數和精度。

#### 支援的操作：

二進制算術：\[+，-，\*，/，％\]

比較運算符：\[>，<，<=，>=，<=>\]

分組運算符：\[Avg，Min，Max，Count，Sum\]

空值檢查

注意：對於二進制運算，如果前置操作數的資料類型不是Big Decimal，查詢引擎也會嘗試對Big Decimal進行截斷和四捨五入，從而導致精度丟失。

例如，以下表達式會導致精度丟失，因為1是前置操作數並且不是Big Decimal：

1 - 3000000089999919191919190000000000000000.2000000

為了避免精度丟失，使用cast：

    cast(1, decimal(48,7) - 3000000089999919191919190000000000000000.2000000)
    

### 我們能做到什麼?

Web3原生的資料類型使得高精度的Web3分析用例成為可能，否則這是不可能實現的：

*   燃料優化是大多數智能合約開發者關注的主要問題，但開發者如何知道何謂「良好」？在自資金的用戶開始尋找替代方案的斷點在哪裡？能夠進行精確的數據倉庫/大數據分析意味著能夠輕鬆了解燃料消耗生態系統隨時間的變化，並幫助開發者將其燃料使用情況置於更廣泛的行業背景中，無論是在DeFi、DEX還是遊戲領域。
    
*   同樣地，使用機器學習模型預測未來的燃料費用，可以讓開發者和用戶了解各種價格點未來的可能性。這為大量使用的用戶提供了最有效的選擇方案，同時也為開發者提供提供低成本替代方案的可能性。

---

*Originally published on [0xKC](https://paragraph.com/@1886/space-and-time-space-and-time)*
