Rufen Sie die Instanzfunktion eines Vertrags von der Einschiffungskonsole auf

Ich habe dieses Tutorial befolgt . Ich habe die folgenden zwei Verträge auf testrpc bereitgestellt:

pragma solidity ^0.4.7;

contract MDBService {

    mapping (address => address) accounts;
    mapping (uint => address) ids;
    uint numberAccounts;

    function MDBService() {
        numberAccounts = 0;
    }

    function register() {
        require(accounts[msg.sender] == 0); //We check if the user is already registered
        ids[numberAccounts] = msg.sender;
        accounts[msg.sender] = new MDBAccount(msg.sender);
        numberAccounts++;
    }
}

contract MDBAccount {

    struct Post {
        uint timestamp;
        string message;
    }

    uint public numberPosts;
    address public owner;
    mapping (uint => Post) posts;

    modifier isOwner() {
        require(owner == msg.sender);
        _;
    }

    function MDBAccount(address _owner) {
        owner = _owner;
        numberPosts = 0;
    }

    function post(string message) isOwner() {
        require(bytes(message).length <= 160);
        posts[numberPosts].timestamp = now;
        posts[numberPosts].message = message;
        numberPosts++;
    }
}

Jetzt, wenn ich anrufe

MDBService.register({gas:700000,from:web3.eth.accounts[1]}) 

Eine neue Instanz von MDBAccount wird erstellt (dh ein neues Konto MDBAccount für den Benutzer mit der Adresse von Konto[1]). Jetzt möchte ich also eine Nachricht von diesem Konto anstelle des Standardkontos[0] posten.

Wenn ich anrufe

MDBAccount.post('Hello') 

es funktioniert, weil es die Instanz verwendet, die erstellt wurde, als der Vertrag bereitgestellt wurde. Aber wenn ich es verwende

MDBAccount.post('Hello',{from:web3.eth.accounts[1]}) 

Es schlägt fehl, weil isOwner nicht zufrieden ist, da es dieselbe Instanz verwendet und nicht die, die beim Aufrufen des obigen Registers erstellt wurde. Wie kann ich also post for account [1] aufrufen?

Antworten (1)

Wie kann ich die Post für accounts[1].

  1. isOwner()Modifikator entfernen

oder

  1. Vertrag einleiten und accounts[1]Parameter einsenden.

oder

  1. Fügen Sie mehrere Eigentümer hinzu

Dafür ist dieser Modifikator da, er hindert andere Adressen daran, Funktionen aufzurufen, die sie nicht aufrufen sollten.


_ownerIn Ihrem speziellen Fall schlage ich vor, Adresse direkt zu Ihrer Struktur hinzuzufügen Post. Wenn Sie nur die Beiträge eines bestimmten Kontos abrufen müssen, filtern Sie sie einfach nach post._owner.

struct Post {
        uint timestamp;
        string message;
        address _owner;
    }
Keiner von ihnen wird funktionieren, weil ich möchte, dass es wie Twitter ist, wo es für jeden Benutzer ein separates Konto gibt und jeder Benutzer seine eigenen Tweets getrennt voneinander hat, die nur in seinem Konto gespeichert werden. Wenn ich die Kontoadresse im Parameter sende, dann die Post sollten nur im Konto dieser Adresse gespeichert werden.
address _ownerNun, dann schlage ich vor, dass Sie direkt zu Ihrer Struktur hinzufügen Post. Wenn Sie nur die Beiträge eines bestimmten Kontos abrufen müssen, filtern Sie sie einfach nach post._owner. Eine andere Möglichkeit besteht darin, Ereignisse zu verwenden, aber in diesem Fall sind Ereignisse nur außerhalb von Solidity sichtbar.
Das Hinzufügen von _owner zu struct Post ist eine wirklich gute Alternative. Danke. Fügen Sie dies als Antwort hinzu und ich werde es als richtig akzeptieren.
@HimanshuChandra hat die Antwort bearbeitet.