Library

庫,在類型中依賴於參數的查找後未找到或不可見

  • October 24, 2017

我正在嘗試理解庫,並且一直執行到“在類型中依賴於參數的查找後未找到或不可見”。

pragma solidity ^0.4.17;

library L{
   struct S{
       uint UI;
   }

   function GetLF(S storage R)external returns(uint LOutP) {
       return R.UI;
   }

   function SetLF(S storage R,uint LInP)external {
       R.UI=LInP;
   }
}

contract C{
   using L for L.S;
   L.S LS;

   function setCF(uint CInP)external {
       L.SetLF(LS,CInP); //<-------error
   }

   function GetCF() external returns(uint COutP){
       return L.GetLF(LS); //<-------error 
   }
}

嘗試在合約中使用庫函式時總是會發生這種情況。

我認為這可能是混音的問題,因為我在這段程式碼中遇到了它。 http://solidity.readthedocs.io/en/develop/contracts.html#libraries

pragma solidity ^0.4.11;

library Set {
 struct Data { mapping(uint => bool) flags; }

 function insert (Data storage self, uint value)external
     returns (bool)
 {
     if (self.flags[value])
         return false;
     self.flags[value] = true;
     return true;
 }

 function remove(Data storage self, uint value)external
     returns (bool)
 {
     if (!self.flags[value])
         return false;
     self.flags[value] = false;
     return true;
 }

 function contains(Data storage self, uint value)external
     returns (bool)
 {
     return self.flags[value];
 }
}


contract C {
   Set.Data knownValues;

   function register(uint value)external {
       require(Set.insert(knownValues, value));//<-----error
   }
}

所以我希望了解此錯誤的原因並更好地了解庫關鍵字。

我懷疑是因為它們降低了一次性部署成本,但增加了多次天然氣運營成本。它們主要用於工廠模式類型的東西,部署成為很多時間成本。

您首先必須將庫函式更改為不是external因為庫呼叫是使用它們的合約內部的。將它們標記為public or內部`。

庫函式呼叫還有一種更直覺的(至少對我而言)語法,所以而不是

L.SetLF(LS,CInP);

你可以做

LS.SetLF(CInP);

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