Solidity
是否可以從可靠的合約中訪問儲存歷史記錄?
使用 web3,我可以像這樣訪問區塊鏈的歷史:
web3.eth.getBalance('0x1234') // returns current balance at address 0x1234 web3.eth.getBalance('0x1234', 1000) // returns balance at block 1000
參照。https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethdefaultblock
我在 Solidity 中找不到類似的東西。Solidity中有對應的模式嗎?還是在 EVM 字節碼中?還是無法做到的根本原因?
不,Solidity 程式碼(以及一般的 EVM 程式碼)只能讀取被呼叫塊的目前狀態。如果它能夠讀取先前區塊的狀態,您將需要區塊鏈的整個歷史來驗證區塊。通過不允許這樣做,乙太坊開發人員可以驗證僅具有目前狀態的塊,這是一個不那麼苛刻的要求。
從理論上講,應該可以建構一個默克爾證明,證明地址在特定區塊具有特定狀態,並傳入必要的數據以允許合約驗證該證明。這樣,合約的呼叫者可以像您在 Web3 範例中所做的那樣獲取舊數據,並且 Solidity 程式碼可以將該數據作為參數獲取,驗證它是真實的並採取相應的行動。但是,這可能不是一件小事,而且我不知道有任何例子。
如果您需要之前區塊的狀態歷史記錄,通常的解決方案是將此歷史記錄顯式儲存在合約儲存中,並在每次進行更改時添加到您的歷史記錄數據中。