Solidity
局部變數和狀態變數,以及它們的區別
我是新來的。當我閱讀solidity 文件時,它說局部變數和狀態變數。但是我找不到這兩個術語的定義。
任何人都可以解釋局部變數和狀態變數的含義,以及它們之間的區別。
狀態變數
從這裡的solidity docs ,
狀態變數是永久儲存在合約儲存中的值。
並且可以在契約中聲明如下,
contract SimpleStorage { uint storedData; // State variable // ... }
局部變數
具有通常的含義,即它們的上下文在函式內部,不能在外部訪問。通常這些是我們臨時創建的變數,用於在計算或處理某些東西時保存值。局部變數(結構、數組或映射)引用儲存,正如此處指出的那樣,局部變數將充當儲存中預先存在的變數的別名。檢查下面引用的範例以了解發生了什麼。
一個常見的錯誤是聲明一個局部變數並假設它將在記憶體中創建,儘管它會在儲存中創建:
/// THIS CONTRACT CONTAINS AN ERROR pragma solidity ^0.4.0; contract C { uint someVariable; uint[] data; function f() { uint[] x; x.push(2); data = x; } }
局部變數 x 的類型是 uint
$$ $$儲存,但由於儲存不是動態分配的,因此必須從狀態變數中分配它才能使用。因此,不會為 x 分配儲存空間,而是僅作為 storage 中預先存在的變數的別名。 將會發生的是編譯器將 x 解釋為儲存指針,並使其預設指向儲存槽 0。這會導致 someVariable(位於儲存槽 0)被 x.push(2) 修改。
執行此操作的正確方法如下:
pragma solidity ^0.4.0; contract C { uint someVariable; uint[] data; function f() { uint[] x = data; x.push(2); } }
儲存位置的預設值
以下是儲存位置的預設值,具體取決於它所關注的變數類型(源):
- 狀態變數總是在儲存中
- 函式參數預設在記憶體中
- 結構、數組或映射類型的局部變數預設引用儲存
- 值類型的局部變數(即既不是數組,也不是結構,也不是映射)儲存在堆棧中