Go-Ethereum

我們如何使用 web3 從前一個塊號中獲取變數的狀態值

  • May 20, 2018

我有一條私有鏈,並且正在執行自己的歸檔節點。與--fast cache=1024選項連接的節點。

例如,我的智能合約上有一個 set 函式。

contract smartContract {
   uint  value;
   function set(uint input) returns (bool success) {
        value = input;
   }
   function getValue() public view
    returns (uint)
   {
       return value;
   } 

}

該函式在塊號 100 和 200 處呼叫。

smartContract.set(10) //deployed at block number 100
smartContract.set(20) //deployed at block number 200

在此刻。如果我們的區塊鍊是同步的,我們知道,當我們呼叫smartContract.get()它時返回 20。

這裡提到智能聯繫人只能看到目前狀態。

合約在執行時只能看到目前狀態,而不是之前的狀態。此限制允許驗證節點僅使用目前狀態,而不需要儲存並能夠訪問所有先前的狀態。

在這裡我們可以得到以前的塊數據。由於我們可以獲得先前的塊數據,因此我們可以獲得先前的狀態。

**$$ Q $$**web3 可以從以前的塊號中檢索值的狀態,而不是返回其最新的狀態值嗎?

如果我們提供塊號,例如 100 smartContract.get() at 100,; web3 可以以某種方式value在塊號 100 處返回 ’ 值而不是在latest?

$$ Q $$web3 可以從以前的塊號中檢索值的狀態,而不是返回其最新的狀態值嗎?

是的,在 web3.py v4.0+ 中。

在進行合約呼叫時,您可以指定一個區塊號(或雜湊)。這些範例來自web3.py 文件

# You can call your contract method at a block number:
>>> token_contract.functions.myBalance().call(block_identifier=10)

# or a number of blocks back from pending,
# in this case, the block just before the latest block:
>>> token_contract.functions.myBalance().call(block_identifier=-2)

# or a block hash:
>>> token_contract.functions.myBalance().call(block_identifier='0x4ff4a38b278ab49f7739d3a4ed4e12714386a9fdf72192f2e8f7da7822f10b4d')
>>> token_contract.functions.myBalance().call(block_identifier=b'O\xf4\xa3\x8b\'\x8a\xb4\x9fw9\xd3\xa4\xedN\x12qC\x86\xa9\xfd\xf7!\x92\xf2\xe8\xf7\xdax"\xf1\x0bM')

# Latest is the default, so this is redundant:
>>> token_contract.functions.myBalance().call(block_identifier='latest')

# You can check the state after your pending transactions (if supported by your node):
>>> token_contract.functions.myBalance().call(block_identifier='pending')

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