Solidity
無合約呼叫的修飾符
用於檢查合約是否呼叫 Solidity 中的函式的修飾符使用了彙編程式碼
extsize
。我想知道為什麼這樣做。使用彙編對我來說似乎很“駭人聽聞”(為什麼solidity沒有“正常”功能來檢查這個?)。有問題的程式碼是modifier noContract(address _addr){ uint32 size; assembly { size := extcodesize(_addr) } require (size == 0); _; }
(編輯自https://ethereum.stackexchange.com/a/15642/33191)
為什麼不用
msg.sender == tx.orgin
作支票?這有漏洞嗎?使用
extsize
這可能會使用(稍微)更少的氣體的原因是什麼?
tx.origin
應在極少數情況下使用。當您檢查時,tx.origin
您正在檢查呼叫來自誰,因此如果使用不當,它可能會打開極端漏洞,或者可能會破壞契約中的功能。
person a -> contract-a -> contract-b
如果你檢查tx.origin
它contract-b
會解析為地址而person a
不是地址contract-a
。如果你檢查msg.sender
它將是contract-a
.正如您所指出的,使用彙編的原因是目前不存在用於處理該問題的內置函式。Solidity 仍然是一門相當年輕的語言,所以這並不奇怪。
關於沒有能夠自稱的契約
發生這種情況的方法只有幾種:
強制合約呼叫自身的具體程式功能或邏輯
呼叫可能觸發回退程式碼執行的未知合約
選項 1 並不是一個真正的問題,因為它很容易控制,但是選項 2 可以讓你對你的合約進行黑客攻擊,因為你正在呼叫的未知合約可以想像實現一個回退函式,該函式會觸發對你的合約的呼叫。
我認為您的問題最好通過發現哪些函式允許合約呼叫自己並更改這些函式來解決,同時刪除對可能觸發您不知道結果的程式碼執行的任何未知合約的呼叫。您可以實施一些組裝魔法來防止這種情況發生,但對我來說,這聽起來像是讓您面臨潛在的漏洞。