Transactions
從另一個合約呼叫合約函式你____G一個_這在噸這FG一種sout of gas
考慮以下兩個合約 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) ; } }