Transactions
重用 msg.value
考慮一個簡單的應付存款函式。
function deposit() public payable returns (uint) { balances[msg.sender] += msg.value; return balances[msg.sender]; }
是什麼阻止某人在一個事務中多次呼叫此函式並重用 msg.value,因為它應該在 1 個事務中保持不變?也許通過制定另一個將呼叫與delegatecall組合在一起的契約,因為它保留了原始的msg.value?
我猜我的想法存在本質上的錯誤,因為這會使幾乎所有聯繫人都容易受到攻擊,但我找不到此類資訊的好資源。如果有人知道一個好地方可以找到更多關於 eth 交易如何工作的此類資訊,請連結它。謝謝!
正如其他人所提到的,msg.value 在整個契約執行過程中不會保持不變。EVM 在程式碼執行期間創建各種過渡狀態,並更新這些狀態之間的 msg.value 欄位。
您可以在乙太坊黃皮書( https://ethereum.github.io/yellowpaper/paper.pdf )上找到此類資訊,請參見第 11、8 頁。 消息呼叫
並重用 msg.value 因為它應該在 1 個事務中保持不變?
不?你從哪裡得到那個的?如果製作一個呼叫你的智能合約,我會這樣做:
function depositTo() public { yourContract.deposit{value: 2 ether}(); yourContract.deposit{value: 1 ether}(); }
msg.value(就您的合約而言)在第一次呼叫時為 2 乙太幣,在第二次呼叫時為 1。