誰,什麼或在哪裡執行電話契約?
在對乙太坊基本原理的大多數解釋中,我錯過了一個重要的細節:“誰執行智能合約的計算?”。
假設我打電話,添加一些氣體,所有這些都允許我從(solidity)合約中提取一些代幣。
程式碼在哪裡執行?
閱讀有關費用的問題讓我相信它是一個礦工。
如果在交易中執行 Solidity,則費用總是由區塊的礦工承擔,即使存在 Out of Gas 或任何類型的執行錯誤。
如果是這樣,哪個礦工會執行程式碼?他們都是?獲勝者?
但是,閱讀有關如何執行合約的問題讓我相信它是執行此合約的節點。那會是連接到的節點嗎?當一個節點需要呼叫另一個合約作為這個合約呼叫的一部分時,它會自己這樣做,還是將它委託給另一個節點?
如果是節點,礦工是否需要重新執行合約才能確定其結果狀態是否正確執行?
另一個問題涉及何時:他們在什麼時間執行。那裡的答案確實涵蓋了一些“誰”,但沒有明確解釋誰在執行它。
智能合約可以訪問儲存在區塊鏈上的數據,它們可以處理數據並將新的或修改過的數據寫回區塊鏈。為了回答您的問題,我們必須詳細研究這些案例。
假設一個函式僅限於從區塊鏈讀取數據,因此它不會改變區塊鏈的狀態。因此,該函式可以直接在您連接的節點上執行,因為它只從節點上可用的目前狀態讀取。此類函式應使用
view
修飾符定義,並使用call
. 屬於這一類的另一個案例是一個甚至不訪問區塊鏈上任何數據的函式。這樣的函式應該使用pure
修飾符來定義。然而,在許多其他情況下,合約想要將數據添加到區塊鍊或修改區塊鏈上的數據。這種行為顯然會改變區塊鏈,因此必須就合約想要做的改變達成共識。為了達成共識,需要進行探勘,因此該函式必須由交易呼叫。礦工收到交易並執行合約要求的功能。基於函式的結果和新的區塊鏈狀態,他們解決了實際探勘過程所包含的密碼學問題。
下面的合約顯示了
view
和pure
函式以及通過事務呼叫的函式的範例:Contract C { // A counter uint cnt; // Constructor function C() { cnt = 0; } // View function, runs on the connected node function getCount() view returns (uint) { return cnt; } // Pure function, runs on the connected node function multiply(uint a, unitr b) pure returns(uint) { return a*b; } // This function has to be mined function incCount() { cnt++; }
總而言之,你提到的兩種情況都存在,這取決於區塊鏈的狀態是否改變。