Solidity

Solidity 如何在一個功能中處理多個應付賬款?

  • June 19, 2021

當我在嘗試 Solidity 時,這個問題突然出現在我的腦海中,從那以後我一直在努力解決這個問題。為了測試,我寫了這個簡單的合約:

contract test{
   uint256 public value;
   function _0() public payable{
       value += msg.value;
   }
   function _1() public payable{
       value -= (msg.value/2);
   }
   function main() external payable {
       _0();
       _1();
   }
}

當我main用 0.01 ETH 跟注時,value變成5000000000000000. 所以我花了 0.01 ETH 來增加value這麼多。但是,如果我用 0.01 ETH 值分別呼叫_0和,我也會增加,使其成為。但是.. 這次我花了 0.02 ETH 來做出完全相同的改變。這怎麼可能?這不是一個主要的安全問題嗎?_1``value``5000000000000000``10000000000000000

樣本交易:

_0打電話

_1打電話

main稱呼

你的合約聲明了一個儲存變數value。出於解釋的目的,假設您將其命名abcvalue. 命名它value並沒有賦予它任何特殊的權力,它只是你選擇的名字。

記住:

  1. 無論您向payable函式發送多少 ETH,該數量都會累積在合約的餘額中。
  2. 在整個交易期間,msg.value總是會給出發送到外部payable函式的 ETH 數量。所以當你在_0()外部呼叫時,msg.valuein_0()指的是發送到的 ETH 數量_0()。當您在_main()外部_main()呼叫和_0()內部呼叫時,msg.valueinside_0()是指發送到的 ETH 數量_main()

記住這些……_main()用 0.01 ETH 呼叫:

合約 ETH 餘額abc
初始狀態0 ETH0
_main()用 0.01 ETH呼叫後0.01 ETH005000,000000,000000

用 0.01 ETH呼叫_0(),然後_1()用 0.01 ETH 呼叫:

合約 ETH 餘額abc
初始狀態0 ETH0
_0()用 0.01 ETH呼叫後0.01 ETH010000,000000,000000
_1()用 0.01 ETH呼叫後0.02 ETH005000,000000,000000

如果您總共發送 0.01 ETH,最終合約餘額將為 0.01 ETH。如果您總共發送 0.02 ETH,最終合約餘額將為 0.02 ETH。沒有重大安全漏洞。如果您濫用 的值,您的契約可能包含缺陷abc,但現在您已經了解了事情的運作方式,我相信您會很好地使用它。

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