Contract-Development

視圖功能是否需要消耗氣體?以及如何以適當的方式發送交易?

  • September 12, 2019

我有一個方法定義為: 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 文件

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