Web3js

為什麼 Ganache 中映射欄位的儲存空間為空?

  • October 19, 2022

我有一個使用mapping欄位作為狀態變數的智能合約。它應該是storage預設的。

contract MetaCoin {
   mapping (address => uint) balances;

   event Transfer(address indexed _from, address indexed _to, uint256 _value);

   constructor() {
       balances[tx.origin] = 10000;
   }

   function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
       if (balances[msg.sender] < amount) return false;
       balances[msg.sender] -= amount;
       balances[receiver] += amount;
       emit Transfer(msg.sender, receiver, amount);
       return true;
   }

   function getBalanceInEth(address addr) public view returns(uint){
       return ConvertLib.convert(getBalance(addr),2);
   }

   function getBalance(address addr) public view returns(uint) {
       return balances[addr];
   }
}

我可以sendCoin從 web3 前端呼叫,並且可以在 Ganache UI 中看到事務事件。但是,我不明白為什麼儲存是空的,如下圖所示:

在此處輸入圖像描述

在 Solidity 中,映射是一種鍵值儲存,並充當由鍵值對組成的雜湊表。在您的映射中,您傳入發件人的地址並返回與該地址對應的硬幣數量。地址充當密鑰,硬幣數量充當價值。這種散列是單向的,這意味著無法從散列中找出密鑰。當您將密鑰提供給映射並且映射找到相應的雜湊時,查找有效。找到雜湊後,映射會進行去雜湊以找到其原始值。但是,Ganache 沒有散列鍵,因此它無法進行去散列,因此它為映射欄位返回一個空儲存。

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