Contract-Development

CALL 操作碼可以用來創建合約嗎?

  • January 10, 2018

黃皮書附錄 H 定義了 CREATE 和 CALL 操作碼。呼叫:

操作數順序為:gas、to、value、in offset、in size、out offset、out size。

通過將第二個操作數(“to”)設置為零,可以使用 CALL 操作碼來創建合約嗎?

如果可能的話,使用 CREATE 和 CALL 之間的區別是什麼?在任何情況下使用 CALL 操作碼創建合約會更好(例如更便宜的天然氣)?

通過將第二個操作數(“to”)設置為零,CALL操作碼可以用於創建合約嗎?

不,它不能。零地址並不特殊。就像任何其他非合約賬戶一樣,當它通過CALL操作碼接收消息時,它沒有要執行的程式碼。

另一個直覺的思考方式是每個操作碼都有自己的 gas 成本,所以這將是一個有趣的 hack,可以避免CREATE操作成本。

我對此仍然很陌生,但我的理解是這是不可能的。只有在請求不修改區塊鏈狀態(通常只讀取欄位或呼叫常量標記函式)時才使用呼叫。

創建一個新的合約實例顯然是在修改區塊鏈數據,因為它必須在返回地址之前集成到塊中。

在我的實驗中(到目前為止)我只使用以下模式就足夠了:

  • 創建合約實例:非同步呼叫(使用 sendTransaction)。完成是通過回調管理的,使用 Tx 雜湊呼叫一次,使用合約地址呼叫第二次。
  • 讀取合約數據:通過呼叫方法同步呼叫本地節點。
  • 更新數據:使用不返回值的方法進行非同步呼叫(使用 sendTransaction)。呼叫同步(或最終非同步)返回 Tx 雜湊,然後可以通過 getTransactionReceipt 監控完成(使用 eth.filter(’latest’) 來告知下一個塊何時被探勘)
  • 非同步接收資訊:在合約中使用事件。通過 eth.filter( options, callback ) 監控接收情況。
  • 在斷開連接後趕上事件:使用 eth.filter({fromBlock: xyz, toBlock: eth.currentBlock, …}).get()

所有這些都在 API https://github.com/ethereum/wiki/wiki/JavaScript-API中解釋(以綜合形式)

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