Solidity
狀態變數:它們是什麼以及如何創建它們?
我是乙太坊和 Solidity 的新手。
我認為狀態變數應該在呼叫之間保留它們的值。
在 Solidity 文件中,在State Variables部分中,它說狀態變數是這樣創建的:
contract SimpleStorage { uint storedData; // State variable // ... }
我創建了以下契約來測試該理論。
contract Test { uint256 times_called; function tc () public returns (uint256) { times_called += 1; return times_called; } }
我用 web3 像這樣呼叫它:
const test = new web3.eth.Contract (contract_abi, contract_address, { from: from_address, data: contract_bytecode }); var value = await test.methods.tc ().call ();
它每次返回 1。
我沒有在這裡聲明一個狀態變數嗎?或者我對狀態變數應該如何工作有誤?
在這段程式碼中:
contract Test { uint256 times_called; function tc () public returns (uint256) { times_called += 1; return times_called; } }
times_called
是一個狀態變數,因為它(正確地)在全域部分中聲明。(還有其他方法,但現在可以這樣做,因為您還處於旅程的早期階段)。狀態變數是持久的。它們的儲存是在合約編譯時佈局的,因此每個變數在鏈上都有一個“槽”,值將持續存在。
您得到的原因
1
是您.call()
在客戶端使用。這是一條客戶端指令,告訴它以只讀方式使用該功能。所以,即使合約是正確的,你也沒有得到你期望的狀態變化。這是一個令人困惑的話題,所以請看這裡:https ://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2
希望能幫助到你。