Contract-Invocation

交易和合約狀態

  • December 1, 2018

想像一下,我有一份允許人們購買代幣的契約。

一段時間後,只剩下一個代幣,但兩個人幾乎同時嘗試從同一個節點(網路伺服器)購買這個代幣。

發生什麼了?第一個問它的人是否得到了令牌,而第二個問它的人即使該塊還沒有被挖出也沒有?

是否需要探勘區塊以更新合約中可用的代幣數量?

更一般地說,每個區塊之間保存的合約狀態在哪裡?

硬幣將屬於首先開採交易的使用者。據我了解,礦工會將第一筆交易包含在區塊中,然後不包含第二筆交易,因為它會使區塊無效。

實際上,即使 B 稍後送出交易,B 也有可能獲得硬幣,但費用更高。在這種情況下,礦工將包含此交易並忽略來自 A 的交易(請注意,在這種情況下,使用者 A 不會獲得任何硬幣)。

一般來說,所有新交易都處於“待處理”狀態,並且在包含到某個塊之前不會被視為“真實”。在對測試網路進行攻擊期間,您實際上可能已經看到了這種行為ropsten:您可以送出交易,它實際上是可見的,etherscan但它會處於一種pending狀態。大約 20-25 分鐘後沒有確認交易被丟棄。

乙太坊白皮書《區塊鏈與挖礦》最後一段解釋道:

一個常見的問題是合約程式碼在物理硬體的“哪裡”執行。這有一個簡單的答案:執行合約程式碼的過程是狀態轉換函式定義的一部分,它是區塊驗證算法的一部分,因此如果將一筆交易添加到區塊 B 中,該交易產生的程式碼執行將是由現在和將來下載和驗證塊 B 的所有節點執行

如果您認為這是有道理的:在將其記錄在區塊鏈上之前,任何事情都不能被聲明為“發生”(即使出現更長的替代鏈,它也可以“恢復”)。

所以

是否需要探勘區塊以更新合約中可用的代幣數量?

答案是“是”:代幣的轉移是合約的執行,它發生在挖礦過程中,並且每個區塊都被記錄在區塊鏈上。

更一般地說,每個區塊之間保存的合約狀態在哪裡?

據我所知,沒有“每個塊之間的狀態”。有一個待處理事務池,每個事務都會更改狀態。所以狀態的改變只有在添加新塊時才會發生。

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