Solidity
無需在乙太坊區塊鏈上進行交易的智能合約執行
如果我作為智能合約的使用者,呼叫一個執行繁重計算但除了僅在函式執行期間存在然後被丟棄的函式變數之外不改變任何內容的函式,這是否會在乙太坊區塊鏈上進行交易?如果沒有,那麼礦工的費用是如何支付的?我知道要執行的程式碼使用了某些氣體,但是如果沒有交易誰支付執行費用?
當呼叫
view
orpure
函式(那些不改變任何餘額或狀態變數的函式)時,沒有鏈上交易並且不支付任何費用。所有的計算都是在客戶端完成的。礦工不參與。不需要支付任何費用,因為礦工根本沒有做任何事情。
任何函式都可以在只讀模式下執行,該模式不會(不能)更改狀態並且會在不
return
等待確認的情況下返回值。有兩種方法可以做到這一點。
- 在合約中,函式可以強烈建議這種模式,因此從客戶端的角度來看,它是預設流程,通過標記函式
view
或pure
.view
讀取狀態,例如讀取儲存的變數並返回有關它們的資訊。pure
是純粹的計算,比如數學。- 無論函式是如何編寫的,客戶端都可以顯式請求幹執行只讀模式。這樣的執行甚至可以包括提議的狀態更改——它們只是不會堅持。
在這兩種情況下,100% 的 gas 都返回了,但是會進行 gas 核算,並且仍然有可能用完 gas,這對於測試依賴於準確核算的函式很有用,例如(偽)
if(gasRemaining > min) { doAgain(); }
在實踐中,這是一個令人困惑的話題。看看這裡,試圖解釋發生了什麼:https ://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2
希望能幫助到你。