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?
Wie kann ich die Post für
accounts[1]
.
isOwner()
Modifikator entfernenoder
accounts[1]
Parameter einsenden.oder
Dafür ist dieser Modifikator da, er hindert andere Adressen daran, Funktionen aufzurufen, die sie nicht aufrufen sollten.
_owner
In 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;
}
Himanshu Chandra
Roman Frolow
address _owner
Nun, dann schlage ich vor, dass Sie direkt zu Ihrer Struktur hinzufügenPost
. Wenn Sie nur die Beiträge eines bestimmten Kontos abrufen müssen, filtern Sie sie einfach nachpost._owner
. Eine andere Möglichkeit besteht darin, Ereignisse zu verwenden, aber in diesem Fall sind Ereignisse nur außerhalb von Solidity sichtbar.Himanshu Chandra
Roman Frolow