Contract-Development
Solidity 函式接收值,將其傳遞給另一個合約函式
我正在嘗試創建一個合約,該合約接收一個名為contribute的函式的價值。
然後我將呼叫另一個帶有值的合約函式。我想知道這是怎麼做到的,不是很清楚。
這是我到目前為止得到的程式碼(為簡單起見,所有其他函式和變數都被省略了):
contract Hub { function contribute(address _address) payable { Project project = Project(_address); project.fund.value(msg.value)(); } } contract Project { function fund(address sender) payable { amount += msg.value; contributors[sender] = msg.value; } }
由於某種原因,這給了我無效的操作碼。可能有什麼問題?我試圖做錯嗎?
操作碼堆棧在這裡:https ://gist.github.com/vongohren/160b61e5fd2b6c0c85fb8829aed9b3b2
對我來說,問題是我沒有發送足夠的氣體。我用不同的方法解決了這個問題,但主要問題是因為我呼叫了另一種契約方法,這會花費更多的氣體然後發送。它拋出了一個無效的操作碼,並且沒有耗盡氣體。
因此,在您的合約中指定將呼叫其他合約的 gas 使用量可能是明智的,這樣使用者將獲得適當的回饋。這樣,如果沒有向主合約發送足夠的氣體,那將是正確的錯誤!不是虛假的無效操作碼錯誤。
fund
需要一個參數,所以嘗試傳遞一個參數給它:project.fund.value(msg.value)( msg.sender )
通過不傳遞參數,Solidity 可能會嘗試查找
fund
不帶參數的函式,但它不會找到並因此將呼叫回退函式,如果它不是,則會通過無效的操作碼導致內部異常payable
。