Das Pushen von address in das Array eines anderen Vertrags gibt TypeError zurück: Member „push“ not found or not visible after argument-dependent lookup in function

Contract User.sol hat eine Funktion requestValidation, die mit einem anderen Vertrag interagiert. Sein Zweck besteht darin, die Adresse des Vertragseigentümers von User.sol in das Array pendingRequestszu verschieben, das im anderen Vertrag (TrustEntity.sol) gespeichert ist.

Vertrag User.sol

pragma solidity ^0.4.11;
import "browser/TrustEntity.sol";

contract User {
    // State variables
    // The contract address for the TrustEntity
    TrustEntity trustEntity;
    address owner = msg.sender;
    bool verified = false;
    uint creationTime = now;
    uint level = 0;

    // Set trustEntity's deployed contract address
    function User(address _trustEntity) {
        trustEntity = TrustEntity(_trustEntity);
    }

    function requestValidation() {
        trustEntity.pendingRequests.push(owner);
    }
}

Vertrag TrustEntity.sol

pragma solidity ^0.4.11;
import "browser/User.sol";

contract TrustEntity {
    address owner;
    address registry;
    address[] public pendingRequests;

    function verifyUsers() {
        /*
        Whenever a user requests verification, his
        address should be pushed to the pendingRequests
        array, so it can then be fetched to verify or
        reject
        */
    }   
}

Remix gibt mir folgende Fehlermeldung:

browser/User.sol:19:6: TypeError: Member "push" not found or not visible after argument-dependent lookup in function (uint256) constant external returns (address)
        trustEntity.pendingRequests.push(owner);
        ^------------------------------^

Ich habe versucht, in ein im Vertrag gespeichertes Array zu pushen, was funktioniert. Wie so

pragma solidity ^0.4.11;
import "browser/TrustEntity.sol";

contract User {
    // State variables
    // The contract address for the TrustEntity
    TrustEntity trustEntity;
    address owner = msg.sender;
    bool verified = false;
    uint creationTime = now;
    uint level = 0;
    address[] public pendingRequests;

    // Set trustEntity's deployed contract address
    function User(address _trustEntity) {
        trustEntity = TrustEntity(_trustEntity);
    }

    function requestValidation() {
        pendingRequests.push(owner);
    }
}

Deshalb verstehe ich nicht, warum es bei einem anderen Vertrag nicht funktionieren würde. Hängt es damit zusammen, dass die ETH für eine Transaktion bezahlen muss, da es sich um eine zustandsverändernde Funktion handelt?

Ich kann nicht in ein Array pushen, das in 0.6.0 im Vertrag gespeichert ist, wie Sie es in ^0.4.11 tun konnten

Antworten (1)

Verträge erhalten keinen Schreibzugriff auf den Status des anderen. Der publicModifikator bedeutet nur, dass der Wert lesbar ist. Angenommen, Sie sind der Entwickler von TrustEntity, kann ich ein paar Optionen vorschlagen:

  1. Entfernen Sie den Benutzervertrag vollständig und speichern Sie alle Informationen über die Benutzer im TrustEntity-Vertrag.
  2. Schreiben Sie einen "Setter" in TrustEntity, wie TrustEntity.pushPending(address)(mit den entsprechenden Kontosteuerungen, um globalen Schreibzugriff zu verhindern)

Meiner Meinung nach ist die erste die eher standardmäßige Verwendung, basierend auf Ihrem offensichtlichen Ziel. Zum Beispiel speichern Token-Verträge typischerweise alle Informationen über die Besitzer des Tokens zentral, anstatt separate Verträge für jeden Benutzer hinzuzufügen.

Option zwei fügt eine Menge Gaskosten und Blockchain-Aufblähen hinzu und fügt mehr Fläche für Sicherheitsfehler hinzu.

Das hat funktioniert, Prost! Ich habe mich für Option 2 entschieden, da ich viele andere Funktionen im Benutzervertrag benötige und diese 2 getrennt halten möchte. Außerdem ist es eine Spielzeug-App, also wird es vorerst funktionieren.