Solidity

局部變數和狀態變數,以及它們的區別

  • January 11, 2019

我是新來的。當我閱讀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);
        }
    }

儲存位置的預設值

以下是儲存位置的預設值,具體取決於它所關注的變數類型():

  • 狀態變數總是在儲存中
  • 函式參數預設在記憶體中
  • 結構、數組或映射類型的局部變數預設引用儲存
  • 值類型的局部變數(即既不是數組,也不是結構,也不是映射)儲存在堆棧中

引用自:https://ethereum.stackexchange.com/questions/25554