Transactions

在交易中執行程式碼而不部署智能合約?

  • July 27, 2021

交易可以發送 eth、與智能合約互動或部署智能合約。

據我所知,當您部署智能合約時,實際上是在執行建構子程式碼,然後返回要部署的智能合約的字節碼。

由此看來,您實際上可以直接在 EVM 事務中執行程式碼(程式碼不是已部署合約的一部分)。

  • 那是對的嗎?
  • 這是否意味著您可以通過將任意程式碼包含在事務中來一次性執行任意程式碼,而無需部署合約?

不,您不能在不部署的情況下呼叫程式碼。

這是狀態轉換函式:

if contractCreation {
   ret, _, st.gas, vmerr = st.evm.Create(sender, st.data, st.gas, st.value)
} else {
   // Increment the nonce for the next transaction
   st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
   ret, st.gas, vmerr = st.evm.Call(sender, st.to(), st.data, st.gas, st.value)
}

https://github.com/ethereum/go-ethereum/blob/3aea432b35f0344d9f7c1f1843a4eca496229ffc/core/state_transition.go#L307

它要麼必須是創建新合約,要麼呼叫現有合約。您甚至不能告訴 EVM 從某個偏移量執行程式碼,它將從 PC = 0(PC - 程序計數器)執行

現在,如果您使用“創建”選項,您可以執行建構子程式碼而不會將合約儲存在 StateDB 中(還),但最後,合約必須被儲存或返回錯誤。如果它返回錯誤,它將不會被儲存(狀態將被恢復)並且你的氣體將會失去。但是如果你沒有在建構子中觸發錯誤,你的合約將被儲存。此外,呼叫 CREATE 將非常昂貴,因為您必須傳遞所有程式碼,並且每個字節花費一個 Gas 量。

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