視圖功能是否需要消耗氣體?以及如何以適當的方式發送交易?
我有一個方法定義為:
getNames() view public
,如果我呼叫它,contractInstance.getNames.estimatedGas()
它會返回一個非零值,為什麼?我的意思是,視圖方法不應該消耗任何氣體!另一方面,由於這是一個呼叫,它不會返回給我一個 tx 雜湊,所以我不能呼叫eth.gettransactionReceipt
,我如何檢查它是否真的消耗了 gas ?此外,假設
method()
是我部署的合約的集合函式,因此需要進行交易探勘,這就是呼叫之間的區別:
contractInstance.method(args,{from:web3.eth.coinbase, gas:...})
並呼叫:
contractInstance.method.sendTransaction(args,{from:web3.eth.coinbase, gas:...})
我的意思是,視圖方法不應該消耗任何氣體!另一方面,由於這是一個呼叫,它不會返回給我一個 tx 雜湊,所以我不能呼叫 eth.gettransactionReceipt,我如何檢查它是否真的消耗了氣體?
純函式和視圖函式實際上會消耗燃料。但是通過 RPC 呼叫它們,只有您的本地節點必須進行計算,因此可以模擬 gas 成本。
如果部署的合約呼叫這些函式,網路中的每個人都必須進行計算,因此他們必須花費 gas。
此外,假設 method() 是我部署的合約的集合函式,因此需要進行交易探勘,這就是呼叫之間的區別:
contractInstance.method(args,{from:web3.eth.coinbase, gas:…})
並呼叫:
contractInstance.method.sendTransaction(args,{from:web3.eth.coinbase, gas:…})
這裡的區別在於,通過使用,
sendTransaction
您可以將乙太幣發送到該函式。如果該功能不是payable
,它將失敗。
在solidity中,如果一個函式讀取狀態但不修改任何狀態,則需要將其聲明為視圖函式。
如果一個函式不讀取任何狀態並且也不修改任何狀態,則可以將其聲明為純函式。
如果一個函式修改了區塊鏈中的狀態,要呼叫該方法,您需要在區塊鏈中進行交易,而sendTransaction是執行此操作的 api。
estimateGas api 提供了在區塊鏈中訪問/修改所產生的氣體量。
在solidity中,只有進行交易才會花費你的gas。如果你只是直接呼叫視圖/純函式,它不會花費你任何氣體。
需要注意的是,如果在非視圖函式內部呼叫了視圖函式,那麼這必須是事務,因為它正在修改狀態(非視圖函式)。
在進行交易的情況下,區塊鏈狀態下的任何操作都會花費你的 gas。
sendTransaction僅用於發送乙太幣,並非如此。發送乙太幣/更新合約的任何變數意味著改變區塊鏈的狀態。所以這將是交易,這將花費乙太幣。
estimateGas是一個 api,如果該方法作為交易的一部分被呼叫,它會給出估計的 gas。
transactionReceipt僅在交易被探勘後添加到區塊鏈時才返回。因此,在呼叫pure/view 函式的情況下,您將不會獲得交易雜湊或收據。
顯然,如果一個函式需要在交易時接收乙太幣,那麼你才需要在函式中添加支付修飾符。
希望它能幫助您理解乙太坊區塊鏈中的交易概念。
有關更多資訊,請查看solidity 的文件。 Solidity 文件