Vinculación de contratos a través del contrato de biblioteca

El problema involucra 3 contratos con una interdependencia de la siguiente manera:
biblioteca --> ProductContract --> BillingContract
Los contratos están estructurados de la siguiente manera: (El contrato DataSet.sol a continuación se hace referencia a partir de un ejemplo de solidez de: https://github.com/ chriseth/solidity-examples/blob/master/iterable_mapping.sol
DataSet.sol:

library DataSet {   
  struct IndexValue { uint keyIndex; uint256 value;}  
  struct KeyFlag { uint key; bool deleted; }  
  struct KeyValue { uint key; uint value; }  

  struct Data {   
      mapping(uint => IndexValue) data;  
      KeyFlag[] keys;  
      //KeyValue[] kvpairs;
      uint size;  
  }  

  function insert(Data storage self, uint key, uint256 value) returns (bool replaced){  
    uint keyIndex = self.data[key].keyIndex;  
    self.data[key].value = value;  
    if (keyIndex > 0)  
      return true;  
    else  
    {  
      keyIndex = self.keys.length++;   
      self.data[key].keyIndex = keyIndex + 1;  
      self.keys[keyIndex].key = key;  
      self.size++;  
      return false;  
    }  
  }  

  function getCurrent(Data storage self) returns(uint index){  
      return self.size - 1;  
  }  

}  

ContratoProducto.sol:

import "DataSet.sol";  
contract ProductContract {  
    using DataSet for *;  
    DataSet.Data d;  
    mapping (uint => uint) IDToVal;  
    function register (uint p_id, uint val) returns (bool registered) {  
        IDToVal[p_id] = val;  
        registered = true;  
    }  
    function getVal (uint p_id) returns (uint v) {  
         return IDToVal[p_id];  
    }  
}

ContratoFacturación.sol:

import "ProductContract.sol";    
contract BillingContract {  
    ProductContract pc;  
    address PC_Address;  
    function BillingContract (address p) {  
        PC_Address = pc;  
        pc = ProductContract(p);  
    function getVal (uint p_id) returns (uint v) {  
        return pc.getVal(p_id);  
    }  
 }

Esto da como resultado un error al compilar:

Error: Library "DataSet" declared twice (will create ambiguities during linking).  
    library DataSet {
    ^
Spanning multiple lines.  
The other declaration is here: DataSet.sol:3:1: 
    library DataSet {   
    ^
Spanning multiple lines.
Compiliation failed. See above.  

Existe una forma de dependencia transitiva de los contratos anteriores: cuando trato de usar todos los contratos en un solo archivo '.sol', la compilación se realiza correctamente. ¿Hay alguna forma de separar y compilar correctamente los archivos '.sol'? ¡Por favor avise!

En qué entorno está compilando. He tenido estos problemas de pila de dependencia antes con versiones anteriores de Solidity en Browser Solidity, aunque pensé que se habían limpiado. Intente importar la biblioteca BillingContract.soltambién y vea si compila
Estoy usando truffle v 3.x para facilitar la compilación de estos contratos, usando solidity ^ 0.4.4 (no parece posible usar una versión superior de solidity en truffle). Intenté su sugerencia, pero aún así da como resultado el mismo error que el anterior
Incluso después de actualizar la versión de Solidity a ^ 0.4.8, veo el mismo problema. Tengo el contrato dependiente BillingContract.solen el siguiente orden - todavía no hay resolución para el error anterior ``` import "DataSet.sol"; import "ContratoProducto.sol"; ```

Respuestas (1)

De hecho, tuve un problema similar en mi contrato y se debió al hecho de que no incluí la versión pragma en el encabezado:

pragma solidity ^0.4.4;

resolvió mi problema

Espero eso ayude

¡Gracias! Intenté 0.4.4, 0.4.6, 0.4.7 también pero fue en vano. No parece que sea un problema de versión del compilador