智能合約驗證的執行情況如何?
我還沒有找到一個連貫的解釋來解釋一個智能合約——它可能與其他智能合約有復雜的互動——是如何被驗證的。請不要在這裡揮手。到目前為止,我所讀到的內容意味著每個節點——礦工和非礦工——都必須執行軟體——契約。這怎麼可能起作用?合約中的公共函式是否被呼叫過?是否呼叫了所有合約間消息傳遞?
我只是不明白這怎麼可能起作用。
有用。
首先是過濾掉格式錯誤的交易,並確定所有節點最終同意的規範交易順序。交易順序是一個關鍵問題,因為如果沒有就輸入順序達成共識,就無法就目前狀態達成共識。
為避免重複,這些文章從略有不同的角度描述了相同的過程:
請參閱此處:乙太坊共識如何驗證來自不同礦工的相同交易?
在這裡:實現交易排序的乙太坊分叉
到目前為止,我所讀到的內容意味著每個節點——礦工和非礦工——都必須執行軟體——契約。這怎麼可能起作用?
考慮這個(偽)函式:
function adder(uint x, uint y) return(uint sum) { return(x+y); }
讓我們把 (2,2) 放進去。你知道什麼會回來嗎?我也是。你執行它並得到 4。我執行它並得到 4。每個想要同意或不同意我們的人也需要執行它。當然,我們會認為任何不同意 4 的人都是錯誤的,我們將開始無視他們的評論。
其中“不可變”部分是輸入和輸入到達的順序。鑑於此,執行良好的節點唯一可能得出的結論是 4。
是的,所有完整節點和礦工都按照區塊中列出的順序執行每筆交易。他們在區塊高度達成協議。每個正常執行的節點都同意塊高度的狀態。因此,例如,已同步到區塊 2,000,000 的節點與其他所有節點一致,在每個細節上都與區塊 2,000,000 的世界的正確解釋一致。
另一個節點可能在前面。比如說,前面有 10 個街區。更準確地說,其他人落後 10 個街區。領先的節點將了解最近的交易,這意味著它的“目前”狀態將領先於其他節點。沒關係,因為其他人很快就會聽到最近的交易。當他們趕上時,他們將達成完全一致。
您可能想知道如何處理具有不同步區塊鏈狀態的交易。總之,他們沒有。他們只送出交易(通過八卦),並希望礦工能夠接收交易並將其包含在一個區塊中。根據定義,該區塊將在未來出現。它將由所有節點在它所包含的塊的上下文中處理,而不是在發送它的節點的世界狀態的上下文中。
換句話說,發送節點不會喊“4!” 期望其他所有人都同意。它說有人用 (2,2) 簽署了一筆交易,並希望將該交易探勘到一個區塊中。當它被探勘到一個塊中時,節點都可以就先前的狀態(如果重要的話)、要執行的程式碼以及該程式碼的唯一可能結果在該上下文中達成一致。
考慮這種並不少見的情況。
一個新手開始同步一個節點,但落後了。新手將錢包地址提供給發送一些資金的其他人。Etherscan 上的錢包餘額顯示收到的資金,但新手的本地錢包沒有。節點沒有跟上增加新手餘額的交易的區塊。它最終會到達那裡。
根據區塊鏈,任何時候節點處理交易時,它都會在之前的所有交易的上下文中進行處理。一個節點對提議的交易或狀態查詢的最好評價是它在它已經知道的交易(和狀態)的上下文中的外觀,也就是在某個區塊高度。
實際上,讀取和更改(事務)的處理方式不同。當接收到更新時,軟體客戶端可能會使用回調來更新 UI 或鏈下數據庫。它所能知道的最好的就是它所知道的最新區塊。可以進行顯示等,在收到新資訊時更新(當塊到達時)。
狀態改變的交易總是被發送到網路,並且必須包含在一個塊中才能產生任何影響。如果一個節點遠遠落後,它可能會發送一個交易並且直到其他人都知道很久之後才知道結果,因為它需要趕上交易出現的區塊。
希望能幫助到你。