Contract-Development
CALL 操作碼可以用來創建合約嗎?
黃皮書附錄 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中解釋(以綜合形式)