Solidity
Solc 編譯器的監督?不適當的映射聲明會覆蓋儲存
我編寫了一個包含映射儲存變數 A 和 B 的合約。這些變數在建構子中使用一些值進行初始化。方法 getBalance 從映射 A 和 B 返回餘額。
在該方法中,我聲明了另一個映射 - 認為它會產生編譯錯誤(因為映射只允許儲存)。相反,它導致了一種奇怪的行為——新的本地映射似乎覆蓋了 mappingA。
沒有本地映射的結果 (100, 200) 符合預期 帶有本地映射的結果 (500, 200) <<< 為什麼?
/** 在 Truffle/TestRPC 中測試 **/
contract Mapping { mapping(address => uint) balancesA; mapping(address => uint) balancesB; function Mapping() { // constructor balancesA[msg.sender] = 100; balancesB[msg.sender] = 200; } function getBalance(address addr) returns(uint, uint) { // If these 2 lines are commented then behavior is as expected mapping(address => uint) balancers; balancers[msg.sender] = 500; return (balancesA[addr], balancesB[addr]); } }
在這裡打開了一個問題,github,ethereum,solidity,issue 1731:https ://github.com/ethereum/solidity/issues/1731
如果我正確理解他們的流程,原始問題 1731 將由問題 1737 關閉,該問題現已合併。將來編譯器可能會針對此類事情發出錯誤。
為開發者豎起大拇指!
除了它是一個可靠的錯誤(因為它應該注意到使用了未初始化的變數),值得一提的是程式碼也不正確。
問題是
mapping(address => uint) balancers
在函式體中沒有分配新的映射。balancers
它只是引入了可以引用一些映射(在別處分配)的變數。在範例
balancers
中沒有初始化並且巧合地引用了balancesA
. 因此出現了意想不到的行為。來自Solidity 文件:
映射僅允許用於狀態變數(或作為內部函式中的儲存引用類型)。