Evm

使用 Solidity 寫入區塊鏈

  • May 5, 2018

所以我最近一直在關注solidity,並獲得了投票應用程序。很容易掌握。但這是我感到困惑的(來自為網路/移動開發的背景):

在一個簡單的基於 Solidity 的投票應用程序的上下文中,該應用程序為提案持有投票權

  1. 可以在進行方法呼叫時增加投票。但似乎沒有明確呼叫“區塊鏈”(我將其視為數據庫)來持久化它。每當我將變數的值更改到區塊鏈時,EVM 是否會自動寫入區塊鏈,或者在函式呼叫結束並且變數值已最終確定時它會這樣做。

  2. 它如何決定將哪些變數寫入區塊鏈,哪些不寫入。我可能正在使用一個簡單的計數器變數 (i=0) 來跟踪循環,如果它被執行超過 100 次就退出循環。計數器是我不打算堅持到區塊鏈的東西。

  3. 在某些地方,還建議在智能合約中維護狀態,如果是這樣,使用同一應用程序的多個使用者的狀態如何相同?

智能合約有儲存,它是持久狀態。在 Solidity 中,“狀態變數”在合約級別聲明並引用儲存中的位置。

預設情況下,函式內聲明的變數位於記憶體中。記憶體沒有持久化。

考慮以下範常式式碼:

contract Test {
    uint256 counter;

    function increment(uint256 times) public {
        for (uint256 i = 0; i < times; i++) {
            counter += 1;
        }
    }
}

在這裡,counter指的是storage中的位置 0 ,因此在事務期間對其進行的任何更改都會保存在區塊鏈中。

循環變數i只存在於記憶體中,所以不影響儲存。

要回答您的個人問題:

  1. 當您修改儲存中的值時,狀態會持久保存在區塊鏈中。
  2. 我對此進行了一些介紹,但https://solidity.readthedocs.io/en/v0.4.23/types.html#reference-types可能有助於了解變數位置的詳細資訊。(您可能想閱讀整章。)
  3. 是的,狀態是在智能合約“內部”維護的。它附加到該合約(該地址),因此與它互動的所有使用者都將看到相同的狀態。

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