Web3js
為什麼 Ganache 中映射欄位的儲存空間為空?
我有一個使用
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 沒有散列鍵,因此它無法進行去散列,因此它為映射欄位返回一個空儲存。