Developer Documentation
  • What is CTEX?
  • Learn about CTEX Chain
    • Ctex Overview: vision, strategy and platform components
    • The Ctex Blockchain
      • Ctex Consensus Mechanism
      • Delegation and Staking with Validators
      • Ethereum (EVM) Compatibility and Smart Contracts
      • Boosting Ctex's Scalability
  • Empowering Global Payments with Ctex
  • Ctex Key Feature
  • Ctex Consensus
  • CTEX Clusters
    • CTEXChain Mainnet
    • CTEXChain Testnet
    • CLI Command
    • Ctex Faucet
    • Audit Report
  • Integrating with Metamask
    • Add Ctex Chain Network to Metamask
    • Config Custom Token
    • How to Reset Metamask Wallet
  • CTEX Exclusive Product
  • Ctex Coin
    • Technical
    • Utility
    • Distribution
  • Run Master Node
  • Developer Guide
    • Token Standard
      • CTEX-721 Token
      • CTEX-20 Token
  • APIs
    • accounts
    • blockNumber
    • call
    • chainId
    • estimateGas
    • gasPrice
    • getBalance
    • getBlockByHash
    • getBlockByNumber
    • getBlockTransactionCountByHash
    • getBlockTransactionCountByNumber
    • getCode
    • getLogs
    • getStorageAt
    • getTransactionByBlockHashAndIndex
    • getTransactionByBlockNumberAndIndex
    • getTransactionByHash
    • getTransactionCount
    • getTransactionReceipt
    • getUncleByBlockHashAndIndex
    • getUncleByBlockNumberAndIndex
    • getUncleCountByBlockHash
    • getUncleCountByBlockNumber
    • getWork
    • hashrate
    • mining
    • protocolVersion
    • sendRawTransaction
    • submitWork
    • syncing
    • net_listening
    • net_peerCount
    • net_version
    • web3_clientVersion
    • parity_nextNonce
    • Filter methods
    • newFilter
    • newBlockFilter
    • getFilterChanges
    • uninstallFilter
  • Depolying CTEX chain
    • Using Remix
    • Using Truffle
    • Using Hardhat
    • Using Replit
    • Using Alchemy
  • Whitepaper
  • Technical Paper
  • Yellow Paper
Powered by GitBook
On this page
  1. APIs

getStorageAt

PreviousgetLogsNextgetTransactionByBlockHashAndIndex

Last updated 1 year ago

REQUEST

Copy

POST https://mainet.rpc.ctexscan.com

HEADER

Copy

Content-Type: application/json

REQUEST PARAMS

  • ADDRESS [required] - a string representing the address (20 bytes) of the storage

  • STORAGE POSITION [required] - a hex code of the position in the storage

  • BLOCK PARAMETER [required] - an integer block number, or the string "latest", "earliest" or "pending", see the

EXAMPLE

Copy

Explain## JSON-RPC over HTTPS POST
curl https://mainet.rpc.ctexscan.com
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","method":"eth_getStorageAt","params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"],"id":1}'

## JSON-RPC over WSS
wscat -c ws://mainet.rpc.ctexscan.com
>{"jsonrpc":"2.0","method":"eth_getStorageAt","params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"],"id":1}

RESPONSE

RESULT FIELDS

  • STORAGE VALUE - a hex code of the integer indicating the value of the storage position at the provided address

BODY

Copy

Explain{
    "jsonrpc": "2.0",
    "id": 1,
    "result": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

Calculating the correct position depends on the storage to retrieve. Consider the following contract deployed at 0x295a70b2de5e3953354a6a8344e616ed314d7251 by address 0x391694e7e0b0cce554cb130d723a9d27458f9298,

Copy

Explaincontract Storage {
    uint pos0;
    mapping(address => uint) pos1;

    function Storage() {
        pos0 = 1234;
        pos1[msg.sender] = 5678;
    }
}

Retrieving the value of pos0 is straight forward:

Copy

Explaincurl https://ignite-rpc.com \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251

Copy

Explain{
    "jsonrpc": "2.0",
    "id": 1,
    "result": "0x00000000000000000000000000000000000000000000000000000000000004d2"
}

Retrieving an element of the map is harder. The position of an element in the map is calculated with:

Copy

keccak(LeftPad32(key, 0), LeftPad32(map position, 0))

This means to retrieve the storage on pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] we need to calculate the position with:

Copy

Explainkeccak(
    decodeHex(
        '000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298' +
            '0000000000000000000000000000000000000000000000000000000000000001'
    )
);

The geth console which comes with the web3 library can be used to make the calculation:

Copy

Explain> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
undefined
> web3.sha3(key, {"encoding": "hex"})
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"

Now to fetch the storage:

Copy

Explaincurl https://ignite-rpc.com \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"], "id": 1}'

Copy

Explain{
    "jsonrpc": "2.0",
    "id": 1,
    "result": "0x000000000000000000000000000000000000000000000000000000000000162e"
}
default block parameter