Transactions

智能合約相互呼叫,成本和原子性存疑

  • April 24, 2021

據我所知,如果你在合約 C 上呼叫函式 F,你需要支付與 F 的操作相關的 gas 費用,如果由於某種原因出現問題,那麼在此之前 F 執行的所有狀態更改都將被撤銷。F 以原子方式工作,呼叫 F 的人類賬戶支付 gas 費用(即使操作被回滾)。

我的疑問來自於 F 在合約 C1 上呼叫其他函式 F1 的情況,該函式可以在合約 C2 上呼叫其他函式 F2 等等…. 人類 -> (C) F -> (C1) F1 -> (C2) F2 -> …

首先,我的理解是原賬戶只支付F操作的gas費用,然後C支付F1操作的gas費用,C1支付F2操作的gas費用,以此類推……

但是如果 Fn 失敗了怎麼辦?F 到 Fn-1 執行的所有狀態修改都會回滾嗎?原始賬戶以及從 C 到 Cn-1 的合約會浪費他們的 gas 費嗎?

使用者為 (C) F -> (C1) F1 -> (C2) F2 -> … 支付 gas

那些在單個原子事務的上下文中執行。考慮到通常不可能在不知道 F1 返回什麼的情況下執行 F 可能會有所幫助。

通常,如果 F2 失敗,那麼錯誤將冒泡到 C 和事務 T。如果 T 恢復,那麼它們都恢復。它將作為失敗的交易出現,失敗的交易不能改變任何東西。

完全失敗的例外可以內置到契約中。C1 可以以一種在 C2 恢復時不會自動恢復的方式呼叫 C2,而是按下,通常在 C2 的成功/失敗時分支。您有時可以在 Etherscan 上看到它指出“部分事務失敗”,即使整個事務成功。

希望能幫助到你

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