Solidity

映射函式返回值

  • August 19, 2022

下面是我在 Solidity 官方網站上看到的程式碼

pragma solidity >=0.4.0 <0.9.0;

contract MappingExample {
   mapping(address => uint) public balances;

   function update(uint newBalance) public {
       balances[msg.sender] = newBalance;
   }
}

contract MappingUser {
   function f() public returns (uint) {
       MappingExample m = new MappingExample();
       m.update(100);            //       **LINE 1**
       return m.balances(address(this));         **LINE 2**
   }
}

m.update(100)契約在做什麼?我認為它將在契約newBalance功能的參數中傳遞價值 100 。但它正在從使用者那裡獲得價值。update``MappingExample

m.balances(address(this))其次,請給我解釋一下line 2 ie在這裡有什麼作用 。

mapping(address => uint) public balances;

是從地址到數字的 Map

address1 -> number
address2 -> number
...

因為它是公開的,Solidity 會為你創建一個名為 balances 的隱藏函式,看起來像這樣,function balances(address addr) view returns (uint)這個函式將返回給定鍵(地址)的儲存值(數字)

該函式function update(uint newBalance) public通過更新作為呼叫者(地址)的鍵的值(數字)來更新此映射

現在

MappingUser 是一個具有函式的新合約function f() public returns (uint)

此函式執行以下操作:

  • MappingExample m = new MappingExample();部署一個新的 MappingExample Contract
  • m.update(100);它向新合約發送請求並呼叫更新函式。警告更新函式有msg.sender,在這種情況下,更新函式的呼叫者是MappingUser合約而不是使用者。所以它基本上改變了地圖中的價值address-of-MappingUser-contract -> 100
  • return m.balances(address(this));它呼叫隱藏餘額函式,並將其地址(MappingUser合約地址)作為參數。address(this)MappingUser合約的地址

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