Solidity
Solidity中tx.origin的安全問題
Mastering Ethereum 一書指出,在智能合約中使用 tx.origin 並不安全。我想知道不安全的原因是什麼?
主要是為了防止網路釣魚契約。
tx.origin
是發起交易的原始使用者。因此,如果合約有這樣的方法(在 Vyper 中):
def burnBalance(): assert tx.origin == owner, "You are not the owner" balance[tx.origin] = 0
然後另一個智能合約可以通過代理功能“釣魚”你——如果你不小心與這個邪惡的合約互動,那麼你將失去你的資金:
# The attacking contract calling the original contract OriginalContract(originalContractAddress).burnBalance()
如果
burnBalance
改為使用 msg.sender 則此攻擊將失敗:# This is the correct way of checking permissions def burnBalance(): assert msg.sender == owner, "You are not the owner" balance[msg.sender] = 0
msg.sender
是中間呼叫者;在這種情況下,網路釣魚契約是msg.sender
.旁注:實際上,乙太坊社區中有一些關於一起刪除 tx.origin 的討論。我個人不同意這一點,因為它有一些利基案例。其中之一是檢查與智能合約互動的呼叫者是另一個智能合約還是普通使用者。例如
assert tx.origin == msg.sender, "Only users can interact with this contract"