純函式和事件是否可驗證/保證
我對solidity非常陌生,所以如果我弄錯了請原諒我,但是如果我使用web3訪問它們,pure和view函式似乎並沒有真正在鏈上執行(但如果我在智能合約中訪問它們),而是我連接的節點將為我執行該函式並返回結果。
從邏輯上講,這似乎導致了一個問題:如果節點只是進行了錯誤的計算怎麼辦,例如只返回 0,因為他們為什麼要為我花費資源?事件似乎也有同樣的問題,因為它們似乎也依賴於一個集中節點在規範內做一些實際上並沒有使節點提供者受益的事情。
我對從 web3 呼叫 view/pure 的理解是否正確?這如何與來自solidity的呼叫一起工作?在這些情況下,計算是否保證正確執行純函式中的程式碼?
只是為了擺脫一些定義:
視圖函式——“函式可以聲明為視圖,在這種情況下它們承諾不會修改狀態。”
純函式——“函式可以聲明為純函式,在這種情況下它們承諾不會讀取或修改狀態。”
這裡重要的部分是這些函式類型不會修改狀態。因為它們不修改狀態,所以沒有理由在區塊鏈上執行對這些函式的呼叫(例如,從 web3)。
如果節點只是進行了錯誤的計算怎麼辦
對於任何無辜的節點,您的程式碼都將像在鏈上執行一樣執行,但僅由一個節點執行(而不是作為交易廣播,它將僅在本地執行)。
有可能會有一個返回錯誤答案的惡意節點,但在這一點上,問題將是您為什麼首先要求該節點提供資訊。如果您自己託管節點,則對視圖/純函式的呼叫將在本地執行(在您自己的節點上)——只要您的節點與網路的其餘部分同步,它們將是正確的。如果您使用的是服務(如 infura),您的呼叫將針對他們的節點執行,並且您假設他們正在誠實行事。
這如何與來自solidity的呼叫一起工作?在這些情況下,計算是否保證正確執行純函式中的程式碼?
如果我理解這個問題,那麼您是在詢問實際事務中的函式呼叫。在這種情況下,呼叫正在“鏈上”執行。這意味著參與探勘過程的每個節點都在執行所有事務以找到一個塊。任何更改數據的嘗試(例如,從視圖/純函式返回不正確的答案)都會使塊無效,並且網路不會將其作為有效塊接受。因此,您可以相信交易正在正確執行——任何篡改只會傷害礦工,因為他們會錯失從探勘有效區塊中獲得的任何獎勵。
我注意到我認為我應該提到的一方面是從 web3 呼叫函式和在實際交易中呼叫它們之間的區別在於
view
,鏈的狀態將根據給定區塊中出現在您的交易上方的交易而發生變化。這些可能會或可能不會影響鏈上給出的結果。這對於
pure
函式來說不是問題,因為它們甚至不會讀取狀態來執行。