Accounts
可贖回合約怎麼會有空賬戶狀態?
在黃皮書的第 4 頁,提供了“空”賬戶的定義。
沒有程式碼、零隨機數和零餘額的帳戶是空的。
然後提供了一個正式的定義,其中“無程式碼”表示帳戶的 codeHash 等於空字元串的 KEC 雜湊。
論文接著說:
即使是可呼叫的預編譯合約也可以有一個空的賬戶狀態。這是因為他們的帳戶狀態通常不包含描述其行為的程式碼。
這讓我很困惑。如果帳戶有程式碼,它的codeHash != KEC("") 不會是空的嗎?
可能一個善良的靈魂會加入更多的細節。在高層次上,“預編譯”具有特定的含義。正如人們可能認為的那樣,它不是預先編譯和部署的合約程式碼。
它更像是在節點中執行的鏈下程式碼的“鉤子”。如您所知,address(0) 用於部署。其他地址,例如地址(1)、地址(2) 等是“預編譯”。
預編譯是在協議級別定義的。它們是確定性的,可以執行諸如執行加密操作之類的事情——通常是有用的事情,如果用 Solidity 編寫,計算量會很大。實現使用節點的程式碼,例如用 Go 編寫的。該結構讓編譯器可以像對待其他合約一樣對待預編譯。執行事務的節點注意到對“特殊”地址的呼叫,並使用它們的子程序來計算確定性響應。
如果帳戶有程式碼,它的codeHash != KEC("") 不會是空的嗎?
如果你檢查區塊鏈,你會發現沒有程式碼部署到這些地址,因為實現不像正常合約。
希望能幫助到你。