Solidity
映射函式返回值
下面是我在 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 Contractm.update(100);
它向新合約發送請求並呼叫更新函式。警告更新函式有msg.sender
,在這種情況下,更新函式的呼叫者是MappingUser
合約而不是使用者。所以它基本上改變了地圖中的價值address-of-MappingUser-contract -> 100
return m.balances(address(this));
它呼叫隱藏餘額函式,並將其地址(MappingUser
合約地址)作為參數。address(this)
是MappingUser
合約的地址