Contract-Design
數組或映射,哪個消耗更多的gas?
我一直在
struct
為我的契約使用數組。在帶有專用網路的 Remix IDE 中,一個功能花費了我大約 300,000 gas。但是,如果我從 web3js 呼叫相同的函式,它會花費我很多,有時成本會超過設置為 9,999,999 的塊氣體限制。您能否讓我知道陣列是否比實際成本更高
mapping
?
數組確實比映射成本更高,但那是因為它沒有做同樣的事情。Solidity 中的 Array 基本上是具有這種結構的結構
struct Array{ mapping(uint => someType) items; uint length; }
最重要的是,數組有圍繞長度的邊界檢查,以便嘗試使用將斷言訪問
items
映射中的項目。0>index>length-1
如果您不需要邊界檢查功能,您可以像上面的結構一樣滾動您自己的“數組”編輯:為了澄清,將數組比作映射+長度變數只是一個例子。數組確實將實際元素按順序儲存在儲存中,從插槽開始,該插槽是儲存數組長度的位置的雜湊值。另一方面,映射儲存就像您所期望的那樣,作為映射根 (r) 和單個鍵 (k) 的儲存位置的雜湊,即鍵 k 的值 v 的位置是 keccak256(r +k)