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.
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, bytes32
damit 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, bytes32
Hashes 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.
anuyog
Rob Hitchens
someMapping()
- mit den Klammern, weil es eine Funktion ist.