Concurrency

區塊鏈如何處理並發?

  • April 7, 2019

我在這裡閱讀了一些關於並發的頁面,但我沒有給出答案,實際上我是 Bchain 的新手,請考慮這種情況:

區塊鏈上有一個 4 人的遊戲合約,到目前為止,遊戲中註冊了 3 名玩家,只剩下一個了!例如,來自兩個不同地區的兩個不同的人想要進入遊戲。它們都連接到兩個不同的節點(礦工)。因此,在每個節點中,契約可以比較剩餘的球員並讓那個人進入。但最後有兩個球員註冊,而只剩下一個位置。

1-這些類型的場景在區塊鏈中是可能的嗎?

2-解決方案是什麼?

如果它是一個集中式系統,我可以通過鎖、信號量等來阻止程式碼,但是這裡的程式碼分佈在每個礦工上,我的意思是每個交易請求都發送給不同的礦工。謝謝

如果他們倆 都在兩個不同的礦工中輸入此程式碼並且兩個礦工都看到計數小於 4,因此他們將發送者添加到列表中並返回“ok”..!!!!!!

function AddPlayer(string name) public returns(string)
{
if (PlayersCount < 4)
{
PlayersCount ++;
// add he address of player to a list and …..  
return "ok";
}

已編輯 2

1- 這段程式碼應該在多少個節點上執行?我的意思是在從前端應用程序向這個函式發送請求之後,它只是返回給我一個真假,對還是錯?那麼如果它返回一個真/假,那麼廣播是什麼?它類似於簡單的 RPC。呼叫函式並返回結果!!

2-廣播交易到底是什麼意思,這個“addPlayer”函式是否呼叫另一個節點上的另一個“addPlayer”?程式碼中沒有這樣的東西,

3-我讀了一些關於驗證交易的內容,你能告訴我這個函式在執行後是如何驗證的嗎?是否需要另一個函式來驗證它

對不起,很長的問題,我真的需要答案。

你對正在發生的事情的概念不太正確。

在交易被探勘之前,沒有玩家參與遊戲。探勘創建了一個明確的交易順序。這種明確的交易順序與用於廣播交易的節點無關。通常,交易將由某處的節點探勘並包含在一個塊中。它通常是 gasPrice 出價最高的交易,所以它不是 FIFO。

不可能同時執行。每個探勘的交易都在由較早的探勘交易創建的狀態的上下文中執行。您編寫契約以接受 4 並拒絕隨後的任何其他契約。

例如,

pragma solidity 0.4.25;

contract FourPlayers {

   uint public maxPlayers = 4;  
   address[] public players;
   mapping(address => bool) public isPlayer;

   event LogPlayerAdded(address player);

   function addMe() public returns(bool success) {
       require(!isPlayer[msg.sender]);
       require(players.length < maxPlayers);
       emit LogPlayerAdded(msg.sender);
       players.push(msg.sender);
       isPlayer[msg.sender] = true;
       return true;
   }
}

您應該能夠通過大量同時簽名的交易來實現這一點。這基本上是一場比賽。註冊不會按照發送的順序到達,而是按照探勘的順序到達。這創造了以高gasPrice競標優先級的經濟激勵,可能是幸運的4人之一。

希望能幫助到你。

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