為什麼允許空賬戶在區塊鏈上?
很難看出允許空賬戶在區塊鏈上的好處是什麼。這是一個已知的微妙之處(參見“注意:零餘額和不存在之間存在差異”)並被“狀態膨脹”攻擊所利用。
- 為什麼協議沒有首先阻止它們的技術挑戰是什麼?
- 國家清算 EIP158 理由和這個問題中提到的協議中的“缺陷”是什麼?
為什麼協議沒有首先阻止它們的技術挑戰是什麼?
沒有任何特別的技術挑戰。這只是一個疏忽,“一個錯誤,一個協議缺陷”。
這是一個已知的微妙之處(請參閱“注意:零餘額和不存在之間存在差異”)
人們一直認為,零餘額賬戶可以作為狀態樹中的一個節點存在,而不存在的賬戶在狀態樹中沒有節點。創建一個新帳戶(無論是否為零餘額)也會在狀態樹中創建一個新節點。使新帳戶創建成本高昂是上述額外 gas 成本的原因:
CALL has a multi-part gas cost: * 40 base * 9000 additional if the value is nonzero * 25000 additional if the destination account does not yet exist (note: there is a difference between zero-balance and nonexistent!)
但疏忽的是,除了
CALL
創建新賬戶外,還有另一種方法,即SUICIDE
繞過 25000 的汽油附加費。“自殺炸彈”DoS 交易利用了這一點。例如,第一個創建了許多新的零餘額賬戶,從 0x00..05地址到0x00..2170。大約8560 個賬戶只需要 800000 個 gas,或者每個賬戶大約 95 個 gas(比使用它的每個賬戶 25000 個 gas 便宜得多CALL
)。國家清算 EIP158 理由和這個問題中提到的協議中的“缺陷”是什麼?
主要缺陷是能夠廉價地創建新帳戶
SUICIDE
,DoS 攻擊利用它來膨脹狀態。如果協議只指定不為零餘額賬戶創建狀態樹節點,那麼SUICIDE
仍然可以通過將 1 wei 轉移到新賬戶來利用攻擊。為了完全防止攻擊,協議還必須在創建新帳戶時指定額外的 gas 成本,無論它們是如何創建的(無論是 byCALL
還是 bySUICIDE
)。在EIP150 中修復的這種疏忽:長期 gas 成本變化:If SUICIDE hits a newly created account, it triggers an additional gas cost of 25000 (similar to CALLs)
由於使用者和礦工需要儲存整個狀態樹以計算狀態根和驗證塊,因此每個新帳戶都會增加其所需的磁碟空間。DoS 攻擊將賬戶總數增加到 2000 萬左右,即 3000 萬個狀態樹節點(狀態樹的結構在賬戶和樹節點之間不是一一對應的),這需要大約 10 GB 的磁碟空間,取決於特定的客戶端實現。狀態清除完成後,賬戶總數降至 772530,即 330 萬個狀態樹節點,需要大約 1 GB 的磁碟空間。