如果你從乙太坊區塊鏈中提取數字數據,它是什麼格式的,為什麼?
我在一次採訪中得到了這個問題,我真的不確定我是否正確。
數字以十六進制格式編碼,它們是大數字。但這背後的原因是什麼?我嘗試了很多Google,但無法真正得到令人滿意的答案。
這是因為現在的電腦執行在 32 位或 64 位處理器上。這是他們的“單詞”大小。(32 實際上是一個雙字,64 是一個四字,但你明白了)
這些處理器真正原生支持的最大整數表示實際上是根據其架構的“字”的大小。只要您保持在這些範圍內,這一切都很好,但是使用 256 位 EVM 字,您已經超越了這個範圍……
我喜歡使用的一個範例,32 位架構被限制為 4GB 的可定址 RAM(在地址擴展“黑客”之前),結果 4GB 是 2^32。你不能超過,因為你沒有足夠的位來代表一個更高的整數……
因此,為了適應每種架構並保持 EVM 在 256 位字上執行,我們必須依賴確實需要更多操作但能夠處理高達 256 位大小的非本地類型(大數字可以遠遠超出此範圍)。此外,它還提供了與底層架構無關的統一數字格式。
您可能會發現我們可以用浮點表示法原生地表示這些數字,但它們確實帶來了一些在金融/精度系統中不希望出現的精度問題。
這背後的原因是區塊鏈(例如乙太坊)中呈現的數值可能非常大。
考慮一下
uint256
,這意味著它可以保存一個與 一樣大的值2**256
,在計算時,它實際上並沒有人類可讀的名稱,也沒有。區塊鏈可以儲存這些數據,因為它從一開始就是為此而設計的,但與之互動的框架和語言卻不能。例如,Javascript 可以安全儲存的最大值為2**53
. 如果您嘗試通過 Javascript 數字在區塊鏈中呈現最大數值,您會發現這是不可能的。因此,十六進制值用於表示大數字,因為這是一種儲存大數值的便捷方式,這就是在此案例中使用它們的原因。有幾個用於大數字操作的 Javascript 庫,但簡而言之,它們的工作方式或多或少都相同,並且它們都提供了一種將十六進制值轉換為字元串或數值的方法(如果可以這樣表示,在如果它太大而無法儲存)。