Solidity
是否可以呼叫現有合約的建構子?
理論上,建構子與任何其他函式一樣只是一個函式,但只會在構造時呼叫一次。因為 EVM 不知道建構子的概念,理論上,在 EVM Opcode 術語中,建構子可以被多次呼叫。這可能是一個安全漏洞,因為開發人員認為建構子不會被多次呼叫。例如,合約所有者地址可能會被覆蓋。
是否可以防止這種可能性?如果可以,如何防止?
建構子實際上不僅僅是一個普通的函式,實際上只呼叫了一次,不能再次呼叫。
EVM 不僅不知道什麼是建構子,它也不知道什麼是函式。在乙太坊中實現函式的方式是編譯器在程式碼的開頭包含一個檢查,它將交易數據的前四個字節與函式簽名進行比較,計算為
bytes4(sha3("myFunction(uint256, bytes, address, ...)"))
.建構子不包含在它檢查的函式簽名列表中,並且建構子程式碼甚至不包含在合約中。
合約是通過發送沒有
to
欄位的交易來創建的。交易中的數據被解釋為 EVM 程式碼。這段程式碼(包括建構子)被執行,它的返回值(不包括建構子)被用作合約中的新程式碼。因此這裡沒有安全漏洞。