Solidity

是否可能同時進行交易(基本但可能非常危險的安全問題……很可能是不可能的……)?

  • December 13, 2019

長話短說,我很好奇契約如何在記憶體中儲存變數,所以是否可以一次發送垃圾郵件說 100 筆交易,然後再更改值……我確信我給出了錯誤的描述,所以這裡是更好的程式碼說明我的觀點:

contract thiscontract
{

uint256 balancer = 3000;

function something() public payable
{
if(balancer > 0)
{
balancer -= 1000;
msg.sender.transfer(1000);
//event Transfer(msg.sender, balancer);
}

}
}

基本上:該函式應該發送不超過 3000 wei,每次發送 1000 wei - 如果第 4 個 msg.sender 在前 3 個呼叫之後呼叫它,它不會發送任何內容,因為值為 0 並且“if”語句阻止它。

但是如果 100 個或更多事務同時呼叫“if”會發生什麼?契約是否“凍結”並一個接一個地處理每一個檢查?或者契約是否允許某種並行性,例如 Web 伺服器,並且許多人可以呼叫它並並行執行此精確操作?

因為如果情況如“並行”中所述,會發生什麼:

// 檢查 “if” 語句需要 0.05 秒左右… // 但是進行了 10000000 次呼叫會導致拒絕服務/並行檢查:

如果(平衡器> 0)

// 假設 5000 通過檢查並繼續發送…如果有人在一小時後呼叫它,它肯定會失敗,但仍然有很多成功。

我確信這是不可能的,我唯一知道的是“如果”檢查或“要求”需要一些計算時間,你可以在沒有任何區塊鏈互動的情況下閱讀合約,但這太基本了,不可能. 也許有人應該通過 ropsten 上的 web3 js/python 中的循環語句發送 200 個事務,看看它們是否都遵守上面的 if 規則或更多成功或更好,然後將它們傳遞給並行執行事務的 aws 實例。

現在的最後說明:從純粹的程式角度來看,這可能是不可能的,因為事務將被發送到字節碼程序集 LIFO,它將遵守“後進先出”規則,導致確實凍結/減速和不可能並行執行(所以沒有:solidity 似乎比 java/c# 或帶有非同步呼叫的 webservers 等簡單得多)。我不是 100% 肯定,也許有很多節點可以做到這一點,但我承認我對乙太坊節點之間的交易流究竟是如何發生的理解有限。

tl;dr:您的交易將按順序執行。

您無法事先確定順序,因為礦工決定將哪些交易添加到區塊中。當您創建假設 4 個交易同時呼叫您的 something() 函式時,您會在智能合約的狀態為“balancer = 3000”時創建這些交易。如果你在目前狀態下模擬它們的執行,它們都會通過。您將它們發送到乙太坊網路,網路中的節點會根據共同的共識規則驗證它們,並在它們正常的情況下將它們儲存並轉發給其他節點。不斷創建區塊的礦工最終會將它們包含在區塊中(假設您提供的氣體對他們來說足夠有吸引力)。您無法確定這些交易將包含在哪些區塊中(但您可以通過提供有吸引力的天然氣量來減少平均時間)。每個事務在一個塊中按順序放置,每個塊在區塊鏈中按順序放置。當一個塊被“執行”(驗證、儲存和中繼)時,其中的交易會根據礦工指定的順序一個接一個地執行。交易執行後,狀態會相應更新,隨後的每個交易都將在該新狀態下執行。

一個旁注:如果不滿足條件,請在您的 something(…) 函式中使用 require(…) 。通過這種方式,您可以確保智能合約在不滿足條件的情況下恢復,並且發送方因此收到資金(剩餘的氣體和提供給“應付”功能的乙太坊)。

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