Interagieren Sie mit einem bereitgestellten Vertrag aus einem anderen Vertrag

Angenommen, ich habe diesen Vertrag, den ich eingesetzt habe

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

Kann ich nun mit den Daten des bereitgestellten Vertrages A in einem anderen Vertrag B interagieren, dh kann ich in Vertrag B den Wert von someMapping ["someString"] erhalten?

Ich verwende Truffle zusammen mit Ganache und MetaMask.

Antworten (1)

Ja.

Es gibt jedoch einen Haken. Verträge können noch keine Argumente mit dynamischer Länge weitergeben, daher funktionieren Zeichenfolgen nicht. Ich habe zu geändert, bytes32damit das einfache Beispiel funktioniert.

Mit diesem Detail aus dem Weg ...

Vertrag B muss die ABI von Vertrag A (die Funktionssignaturen) und seine Adresse kennen.

Die einfachste Methode besteht darin, beide Dateien in dieselbe Quelldatei aufzunehmen. Beachten Sie, dass Sie B nur einsetzen können, wenn A bereits irgendwo da draußen ist und Sie Kenntnis von seiner Adresse haben.

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);
  }
}

Sie müssen dieses Beispiel offensichtlich erweitern, um Werte in A irgendwie festzulegen, damit der Test etwas interessanter wird.

Wenn die Schlüssel wirklich sein müssen strings, könnten Sie in Betracht ziehen, bytes32Hashes der zu verwenden strings. Auf diese Weise erstellt jede eindeutige Zeichenfolge einen eindeutigen Schlüssel mit fester Größe. Fadenziehende Tasten sind fast immer ein Zeichen dafür, dass man sich in Solidity verirrt hat.

Ich hoffe es hilft.

Vielen Dank für Ihre Hilfe. Ich erhalte diesen Fehler TypeError: Member „someMapping“ not found or not visible after argument-dependent lookup in type(contract „A“) Ich habe someMapping in Vertrag A als öffentlich deklariert
someMapping()- mit den Klammern, weil es eine Funktion ist.