Transactions

從另一個合約呼叫合約函式你____G一個_這在噸這FG一種sout of gas

  • October 12, 2016

考慮以下兩個合約 A 和 B。假設我將它們儲存在 a 和 b 中。然後,當我撥打電話並嘗試傳遞兩個地址時,如下所示:

a.reqswap(b.address,eth.accounts

$$ 0 $$,eth.accounts$$ 1 $$) 它不會增加計數器。我確保合約 a 和 b 中有乙太幣。

另一方面,如果我從程式碼中刪除地址參數 x,y 和所有包含 x,y 的語句,然後呼叫:

a.reqswap(b.address)

這次它起作用了,並且 b.counter 增加了。

正如我所說,我確實確保設置了 eth.defaultAccount 並且契約中也有乙太幣(以便提供氣體)。


contract A {

   address  public owner;
   uint     public counter ; 
   B b ;
   address public bc ;
   address public bo ; 

   modifier owneronly {
       if (msg.sender != owner)
           throw;
       _
   }

   function A() {
       owner = msg.sender;
       counter = 1 ; 
   }

   function increment(address x,address y) public {
      counter = counter + 1 ;
      bc = x ;
      bo = y ; 
   }

   function reqswap(address baddr,address x,address y)  public {
       b = B(baddr)  ; 
       b.increment(x,y) ; 
   }
}


contract B {

   address  public owner;
   uint     public counter ; 
   A a ;
   address public ac ; 
   address public ao ;

   modifier owneronly {
       if (msg.sender != owner)
           throw;
       _
   }

   function B() {
       owner = msg.sender;
       counter = 1 ; 
   }

   function increment(address x,address y) public {
      counter = counter + 1;
      ac = x ;
      ao = y ; 
   }

   function reqswap(address aaddr,address x,address y)  public {
       a = A(aaddr)  ; 
       a.increment(x,y) ; 
   }
}

擁有足夠的 Ether 與交易中指定的 gas 數量仍然不同。這個問題是通過增加氣體來解決的: a.reqswap(b.address, eth.accounts[0], eth.accounts[1], {gas:120000})


**一般提示:**當事情被調試後,有些場景可以工作,有些則不能,嘗試增加交易中的氣體。

雖然您通過增加 gas 限制解決了您的問題,但該範例通常對於了解如何在另一個合約中呼叫函式很有教育意義。以下是相同功能的最小化版本:

contract A {
   uint counter ; 
   function increment(uint add) {
      counter = counter + add;
   }
}

contract B {
   function delegateIncrement(address aaddr, uint add) {
       A(aaddr).increment(add) ; 
   }
}

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