Solidity

檢查餘額的最佳方法?msg.sender.balance 與餘額米克__.發送___呃_米sG.s和nd和rmsg.sender

  • December 23, 2020

如果我想檢查付款人是否有足夠的資金,我應該使用…

msg.sender.balance 

或者

balances[msg.sender] 

?

我還看到人們通常通過以下方式檢查餘額:

require((balances[msg.sender] + msg.value) >= balances[msg.sender]);

我想我錯過了一些東西,因為對我來說最合乎邏輯的方式是:

require(msg.sender.balance >= msg.value );

提前致謝!

我想我錯過了什麼

你肯定錯過了一些東西——這是兩種不同的平衡:

  • msg.sender.balance是乙太餘額msg.sender
  • balances[msg.sender]是的代幣餘額msg.sender

後者僅在維護儲存變數的合約中有效(可以編譯):

mapping (address => uint) balances

或者在繼承此類合約的合約中(通常是代幣合約)。

他們是兩個不同的東西。

msg.sender.balance是協議級別的乙太坊餘額。

balances[msg.sender將是包含數據的數組或映射中的元素,通常是用於內部會計目的的數字。

例如,如果您有一個為使用者保存 ETH 的 ATM 合約,則映射mapping(address => uint) balances可以保存所有存款人的餘額資訊,而手頭的 ETH 總量將全部在address(this).balance.

使用者在系統外的錢會在裡面,msg.sender.balance但這可能不相關。檢查使用者沒有發送比他們擁有的更多的錢並不重要,因為協議會處理這個問題。

至關重要的是,檢查使用者提款的金額是否超出契約內部會計規定的金額,因為契約中的可用資金超過了個人使用者應收到的金額。

希望能幫助到你。

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