Transactions
是否可以在特定交易中回滾或分叉智能合約?
假設我想將儲存在合約中的所有數據僅保留到特定交易。智能合約是否有任何類型的回滾過程或分叉機制,可以讓我返回或創建具有特定先前交易指定狀態的新合約?
回滾是不可能的。創建新的智能合約始終是可能的。沒有什麼可以阻止您部署新的智能合約,從與舊合約狀態之一相對應的特定初始狀態開始,精心製作舊合約的模仿行為。從網路的角度來看,這兩個合約將是完全不相關的。
你不得不:
- 找出舊智能合約的狀態 - 很棘手,見下文
- 為新的智能合約生成程式碼以準確預設該狀態 - 簡單明了(除非合約的狀態/邏輯取決於其自身地址的確切值)
您可以使用 web3 API 訪問合約的公共變數: 如何從 web3.eth 訪問合約的成員變數?. 您也可以閱讀合約的日誌記錄:web3: How do I get past events of
myContract.myEvent
。您需要與具有區塊鏈相關部分的節點以及您想要複製的狀態進行對話。後者可以通過創建部分區塊鏈導出(將塊號範圍指定為“geth 導出”)然後將其導入一個全新的節點來完成,該節點與網路的其餘部分隔離(geth –maxpeers 0)。您不能按名稱讀取私有成員,但可以直接訪問,如果您知道他們在儲存中的地址,請參閱https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetstorageat和https://github.com/乙太坊/wiki/wiki/JSON-RPC#eth_getstorageat。您不能完全轉儲地圖,但如果您知道密鑰,您仍然可以讀取該值(RPC 文件解釋瞭如何將密鑰轉換為儲存地址)。您可以從日誌條目或交易數據中重建相關的關鍵值。