Contract-Development

重構智能合約時出現不可預測的狀態錯誤

  • July 4, 2018

乙太坊智能合約功能僅限於大約 16 個局部變數。當它們超過該數量時,stack is too deep就會產生錯誤。

解決方案是將大型函式重構為較小的函式。例如:

Contract A{
  function B(p1,p2,p3...pn){
  }
}

可發展為:

Contract A{
  function B1(p1,p2){
  }
  function B2(p3,p4){
  }
  ...

}

現在假設一些函式依賴於其他函式的結果。換句話說,由一個函式引起的狀態變化會影響另一個函式的行為。

我想到的這個問題是本文討論的不可預測的狀態,指出:

通常,當使用者向網路發送交易以呼叫某個合約時,他無法確定該交易是否會以與發送該交易時的合約相同的狀態執行。

我們如何確保想要與函式進行交易的使用者B1隨後想要使用函式進行交易,B2而其他人不會再次更改因交易而導致的狀態B1

如果一些變數是臨時的並且可以包含在它們的函式中,您可以B1()從 inside呼叫B2(),這樣可以繞過堆棧深度限制,同時仍然保證執行順序。

如果您必須將其拆分為兩個呼叫,並且呼叫它們的順序很重要,您可能需要自己管理依賴關係。例如,將一個變數寫入B1()並檢查它,如果它還沒有寫入,則B2()呼叫它。revert

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