Interactuar con un contrato implementado desde otro contrato

Digamos que tengo este contrato que he implementado

contract A {
        mapping (string => uint) public someMapping;
}

Ahora, ¿puedo interactuar con los datos del contractA desplegado en algún otro contractB, es decir, en contractB puedo obtener el valor de someMapping["someString"]?

Estoy usando Truffle junto con Ganache y MetaMask.

Respuestas (1)

Sí.

Sin embargo, hay un problema. Los contratos aún no pueden pasar argumentos de longitud dinámica, por lo que las cadenas no funcionarán. Cambié a bytes32para hacer que el ejemplo simple funcione.

Con ese detalle fuera del camino...

El contrato B debe tener conocimiento del contrato A ABI (las firmas de función) y su dirección.

El método más sencillo es incluir ambos archivos en el mismo archivo de origen. Tenga en cuenta que puede implementar B solo si A ya está en algún lugar y tiene conocimiento de su dirección.

B.sol

contract A {
  mapping (bytes32 => uint) public someMapping;
}

contract B {
  A a; // cast "a" as "contract A" defined above

  function B(address addressA) public { // pass address of "A" to the constructor
    a = A(addressA);
  }

  function getAUint(bytes32 key) public view returns(uint) {
    return a.someMapping(key);
  }
}

Obviamente tendrá que extender este ejemplo para establecer valores en A de alguna manera para que la prueba sea un poco más interesante.

Si las claves realmente necesitan ser strings, podría considerar usar bytes32hashes de strings. De esta forma, cada cadena única creará una clave única de tamaño fijo. Las teclas fibrosas casi siempre son una señal de extraviarse en Solidity.

Espero eso ayude.

Gracias por tu ayuda. Recibo este error TypeError: Miembro "someMapping" no encontrado o no visible después de la búsqueda dependiente del argumento en el tipo (contrato "A") He declarado someMapping como público en el contrato A
someMapping()- con los corchetes, porque es una función.