在 Solidity 中获得平衡的两种方法

uye*_*roh 4 solidity

据我所知,有两种方法可以获得某个地址的余额。

  1. address firstAddress; "firstAddress.balance" 这将获得地址“firstAddress”的余额。
  2. address firstAddress; mapping ( address => uint) balanceFirstAddress; balanceFirstAddress[firstAddress] 这将获得地址“firstAddress”的余额。

我知道第一个是去一个地址并获得余额。我不明白怎么mapping(address => uint)会得到那个地址的余额。它不mapping只是一个将函数从十六进制散列到可以进行数学运算的二进制值的散列函数吗?

另外,如果两个函数都得到地址的平衡,它们之间有什么区别,我应该什么时候使用哪个?

提前致谢!

Sha*_*van 5

我认为重要的是要注意,默认情况下mapping (address => uint256) balanceFirstAddress不会返回地址的余额。您必须先初始化该映射以获得平衡,然后在适当的时候添加到它。如果您不将值映射到键,它只会返回零。

什么是映射?

映射用于构造值类型并由_KeyType链接到_ValueType.

它是这样声明的 mapping(_KeyType => _ValueType) mappingName;

例如: mapping (address => uint256) balanceOf;

address_KeyTypeuint256_ValueType。在uint256这种情况下表示被链接到一个平衡address

您可以将address视为您将通过以返回uint256value 的键。

uint256 balance = balanceOf[address]; /// balance would be a uint256 value.

根据文档,默认情况下映射是空的,并且必须有一个新的_keyType映射到_ValueType.

因此,要向地址添加余额,您可以输入:

uint256 balanceToAdd = 200;

balanceOf[address] += balanceToAdd;
/// balanceOf[address] is 200 (address = 200)
Run Code Online (Sandbox Code Playgroud)

你应该使用哪一个?

这取决于您要实现的目标,如果您只想要地址的整体以太余额,则可以使用address.balance. 如果您的合约想要跟踪 ERC20 代币的发送和接收,您可以将该代币余额的增加和减少映射到一个地址。

下面是一个例子:

contract MyToken {
    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function MyToken(
        uint256 initialSupply
        ) {
        balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens
    }

    /* Send coins */
    function transfer(address _to, uint256 _value) {
        require(balanceOf[msg.sender] >= _value);           // Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
        balanceOf[msg.sender] -= _value;                    // Subtract from the sender
        balanceOf[_to] += _value;                           // Add the same to the recipient
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为了帮助澄清,地址(无论地址是帐户还是合约都没关系)可以持有以太币并且可以通过“address.balance”访问。这是以太坊默认工作方式的一部分。通常,合约中的内部映射用于跟踪合约的余额是否应该在其他地址之间分配并最终转出。代币合约与此类似,只是国家规定了代币所有权,并且“this.balance”仍然指的是以太币余额而不是代币供应。 (2认同)