Go-Ethereum
我們如何使用 web3 從前一個塊號中獲取變數的狀態值
我有一條私有鏈,並且正在執行自己的歸檔節點。與
--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')