Extracting Read/Write Sets of State Variables from an Ethereum Smart Contract
As the popularity of Ethereum-based decentralized applications (dApps) continues to grow, understanding how they store data on-chain has become increasingly important. In this article, we’ll explore methods for extracting read and write sets of state variables from a smart contract written in Solidity.
Understanding Ethereum State
In an Ethereum smart contract, state is represented as an object that stores data. Each object can have multiple properties (state variables), which are accessed using dot notation or bracket notation. For example:
pragma solidity ^0.8.0;
contract MyContract { {
uint public counter; // read-only variable
mapping ( address => uint ) public memo ; // map of user addresses to counters
function incrementCounter() public payable {
counter += 1;
} } }
function updateMemo ( address _user , uint amount ) public { {
memo[_user] = amount;
} } }
} } }
In this example, the counter
variable is a read-only property that can be accessed using dot notation (MyContract.counter
). The memo
map is also a read-only property that can be accessed using bracket notation (MyContract.memo["user"]
).
Extracting Read and Write Sets of State Variables
To extract read and write sets of state variables from an Ethereum smart contract, you’ll need to use the following approaches:
- Get all properties: Use
solhint get-variables
orsolc get-variable-counts
to retrieve a list of all properties (state variables) in the contract.
- Use reflection: You can use Solidity’s reflection functionality (
solc --reflection
) to inspect and modify the contract’s state variables at runtime.
Example: Extracting Read and Write Sets of State Variables
Assuming we have an Ethereum smart contract called MyContract
with a read-only variable counter
and a write set memo
, we can use the following steps:
- Get all properties using
solhint get-variables MyContract
:
$ solhint get-variables MyContract
Counter : uint
Memo : mapping ( address => uint )
- Inspect and modify the contract’s state variables at runtime using Solidity’s reflection functionality (
solc --reflection
) with the following command:
$ solc -- reflection -- print - vars MyContract

Read-only variable
Counter ( uint )
Write set
memo : mapping ( address => uint ) ;
Note that the --print-vars
flag is used to print all variables in the contract, including read-write and internal variables.
Conclusion
Extracting read and write sets of state variables from an Ethereum smart contract requires a combination of Solidity’s reflection functionality, solhint
, and possibly manual inspection using Solscan or other tools. By understanding how to use these techniques, you’ll be able to better analyze and understand the behavior of your own Ethereum smart contracts.
Recommendations
- Use
solhint get-variables
to retrieve a list of all properties (state variables) in the contract.
- Use Solidity’s reflection functionality (
solc --reflection
) with the--print-vars
flag to inspect and modify the contract’s state variables at runtime.
- Consider using Solscan or other tools to help identify and extract information about your smart contracts.
Leave a Reply