Transactions

重用 msg.value

  • July 29, 2022

考慮一個簡單的應付存款函式。

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。

引用自:https://ethereum.stackexchange.com/questions/132630