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 pendingRequests
zu 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?
Verträge erhalten keinen Schreibzugriff auf den Status des anderen. Der public
Modifikator bedeutet nur, dass der Wert lesbar ist. Angenommen, Sie sind der Entwickler von TrustEntity, kann ich ein paar Optionen vorschlagen:
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.
Tech-Ingenieur aus New York