Consensus

傻瓜智能合約共識

  • June 20, 2017

我已經閱讀了網路中節點關於智能合約共識的其他一些問題/答案,但我仍然不明白這些步驟。我是這樣描繪的:

  1. 兩方可能就智能合約達成一致,用他們的私鑰簽署
  2. 節點驗證那些當事人是他們所說的人
  3. 智能合約附加到區塊鏈

假設合約是根據一周中的哪一天從 Adam 支付給 Bob 的簡單付款(星期一 = 1 個泡泡幣,星期二 = 2 個泡泡幣,等等)

部分程式碼可能如下所示:

If Monday, send 1 from Adam to Bob, else 
If Tuesday, send 2 from Adam to Bob, else 
If Wednesday, send 3 from Adam to Bob....

我的問題是,如果我們在周三執行程式碼,這些節點會做什麼?他們是否檢查以確保合約中的程式碼與每個其他節點看到的程式碼相同?還是他們實際執行程式碼,獲取輸出(這裡從 Adam 到 Bob 是 3),然後將該 OUTPUT 與系統中的其他 OUTPUT 進行比較?如果他們比較輸出,如果節點之間的輸出不同怎麼辦?我希望提供一個範例契約將幫助我想像節點實際同意的內容。

節點實際同意的內容

許多細節,但在高層次上 2 主要是:

  • 區塊鏈的狀態,包括確切的合約程式碼
  • 該程式碼在執行時的行為和結果(技術術語是狀態轉換函式

更詳細的細節包括程式碼在區塊鏈上的位置、誰把它放在區塊鏈上、一個賬戶有多少“硬幣”等。

他們是否檢查以確保合約中的程式碼與每個其他節點看到的程式碼相同?

乙太坊節點遵循乙太坊協議定義的規則。如果某些東西不遵守規則,節點會有效地忽略它。一個節點從其他節點獲取數據,但根據協議處理數據。 一個節點更關心是否遵循乙太坊協議,而不是其他節點是否遵循該協議。 但是對於一個節點來說,連接到遵循該協議的其他節點是很重要的,否則該節點沒有數據可以加入並成為乙太坊網路的一部分。

…如果節點之間的輸出不同怎麼辦?

遵循乙太坊協議的節點應該始終保持**一致,因為該協議是確定性的並且是經過仔細定義**的。基本上,如果一個節點遵循協議,而另一個節點產生不同的輸出,則只有第一個節點是網路的一部分:後一個節點被忽略。當乙太坊協議中缺少定義時,節點可以不同意,為了解決分歧,更新協議,升級節點以獲得新規則並再次形成共識。

要執行smart-contract你需要與它互動,它不是self-executable

互動只能通過向其發送交易(向其發送乙太幣)來實現。因此,如果您在周三發送 ETH,它會檢查情況並按照您在程式碼中指定的方式進行操作。

將該輸出與系統中的其他輸出進行比較?

不,它不會將輸出與其他節點進行比較,因為每 11 秒的交易礦工通過探勘驗證它。

如果他們比較輸出,如果節點之間的輸出不同怎麼辦?它不可能不同。如果您在不同的機器上執行相同的程式碼,則輸出必須相同,這是設計所承諾的。

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