Solidity
Solidity 如何在一個功能中處理多個應付賬款?
當我在嘗試 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
樣本交易:
你的合約聲明了一個儲存變數
value
。出於解釋的目的,假設您將其命名abc
為value
. 命名它value
並沒有賦予它任何特殊的權力,它只是你選擇的名字。記住:
- 無論您向
payable
函式發送多少 ETH,該數量都會累積在合約的餘額中。- 在整個交易期間,
msg.value
總是會給出發送到外部payable
函式的 ETH 數量。所以當你在_0()
外部呼叫時,msg.value
in_0()
指的是發送到的 ETH 數量_0()
。當您在_main()
外部_main()
呼叫和_0()
內部呼叫時,msg.value
inside_0()
是指發送到的 ETH 數量_main()
。記住這些……
_main()
用 0.01 ETH 呼叫:
合約 ETH 餘額 abc
初始狀態 0 ETH 0 _main()
用 0.01 ETH呼叫後0.01 ETH 005000,000000,000000 用 0.01 ETH呼叫
_0()
,然後_1()
用 0.01 ETH 呼叫:
合約 ETH 餘額 abc
初始狀態 0 ETH 0 _0()
用 0.01 ETH呼叫後0.01 ETH 010000,000000,000000 _1()
用 0.01 ETH呼叫後0.02 ETH 005000,000000,000000 如果您總共發送 0.01 ETH,最終合約餘額將為 0.01 ETH。如果您總共發送 0.02 ETH,最終合約餘額將為 0.02 ETH。沒有重大安全漏洞。如果您濫用 的值,您的契約可能包含缺陷
abc
,但現在您已經了解了事情的運作方式,我相信您會很好地使用它。