Evm
使用 Solidity 寫入區塊鏈
所以我最近一直在關注solidity,並獲得了投票應用程序。很容易掌握。但這是我感到困惑的(來自為網路/移動開發的背景):
在一個簡單的基於 Solidity 的投票應用程序的上下文中,該應用程序為提案持有投票權
可以在進行方法呼叫時增加投票。但似乎沒有明確呼叫“區塊鏈”(我將其視為數據庫)來持久化它。每當我將變數的值更改到區塊鏈時,EVM 是否會自動寫入區塊鏈,或者在函式呼叫結束並且變數值已最終確定時它會這樣做。
它如何決定將哪些變數寫入區塊鏈,哪些不寫入。我可能正在使用一個簡單的計數器變數 (i=0) 來跟踪循環,如果它被執行超過 100 次就退出循環。計數器是我不打算堅持到區塊鏈的東西。
在某些地方,還建議在智能合約中維護狀態,如果是這樣,使用同一應用程序的多個使用者的狀態如何相同?
智能合約有儲存,它是持久狀態。在 Solidity 中,“狀態變數”在合約級別聲明並引用儲存中的位置。
預設情況下,函式內聲明的變數位於記憶體中。記憶體沒有持久化。
考慮以下範常式式碼:
contract Test { uint256 counter; function increment(uint256 times) public { for (uint256 i = 0; i < times; i++) { counter += 1; } } }
在這裡,
counter
指的是storage中的位置 0 ,因此在事務期間對其進行的任何更改都會保存在區塊鏈中。循環變數
i
只存在於記憶體中,所以不影響儲存。要回答您的個人問題:
- 當您修改儲存中的值時,狀態會持久保存在區塊鏈中。
- 我對此進行了一些介紹,但https://solidity.readthedocs.io/en/v0.4.23/types.html#reference-types可能有助於了解變數位置的詳細資訊。(您可能想閱讀整章。)
- 是的,狀態是在智能合約“內部”維護的。它附加到該合約(該地址),因此與它互動的所有使用者都將看到相同的狀態。