Solidity

Solc 編譯器的監督?不適當的映射聲明會覆蓋儲存

  • March 6, 2017

我編寫了一個包含映射儲存變數 A 和 B 的合約。這些變數在建構子中使用一些值進行初始化。方法 getBalance 從映射 A 和 B 返回餘額。

在該方法中,我聲明了另一個映射 - 認為它會產生編譯錯誤(因為映射只允許儲存)。相反,它導致了一種奇怪的行為——新的本地映射似乎覆蓋了 mappingA。

沒有本地映射的結果 (100, 200) 符合預期 帶有本地映射的結果 (500, 200) <<< 為什麼?

/** 在 Truffle/TestRPC 中測試 **/

contract Mapping {

 mapping(address =&gt; uint)  balancesA;
 mapping(address =&gt; 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 =&gt; 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 關閉,該問題現已合併。將來編譯器可能會針對此類事情發出錯誤。

為開發者豎起大拇指!

https://github.com/ethereum/solidity/pull/1737

除了它是一個可靠的錯誤(因為它應該注意到使用了未初始化的變數),值得一提的是程式碼也不正確。

問題是mapping(address =&gt; uint) balancers在函式體中沒有分配新的映射。balancers它只是引入了可以引用一些映射(在別處分配)的變數。

在範例balancers中沒有初始化並且巧合地引用了balancesA. 因此出現了意想不到的行為。

來自Solidity 文件

映射僅允許用於狀態變數(或作為內部函式中的儲存引用類型)。

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