Solidity

狀態變數:它們是什麼以及如何創建它們?

  • July 15, 2020

我是乙太坊和 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

希望能幫助到你。

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