Solidity

從啟動控制台呼叫合約的實例函式

  • January 27, 2018

我正在關注教程。我在 testrpc 上部署了以下兩個合約:

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++;
   }
}

現在當我打電話

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

創建一個新的 MDBAccount 實例(即為具有帳戶地址的使用者創建一個新帳戶 MDBAccount

$$ 1 $$).所以現在我想從這個帳戶而不是預設帳戶發布消息$$ 0 $$. 當我打電話

MDBAccount.post('Hello') 

它之所以有效,是因為它使用了部署契約時創建的實例。但是當我使用

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

它失敗是因為 isOwner 不滿意,因為它使用的是同一個實例,而不是在呼叫上述寄存器時創建的實例。那麼我該如何呼叫 post for account

$$ 1 $$.

那麼我該如何呼叫 post 為accounts[1].

  1. 移除isOwner()修飾符

或者

  1. 啟動合約並發送accounts[1]參數。

或者

  1. 添加多個所有者

這就是這個修飾符的用途,它限制其他地址呼叫它們不應該呼叫的函式。


在您的特定情況下,我建議將地址_owner直接添加到您的 struct Post。當您只需要檢索特定帳戶的文章時,您只需按 過濾它們post._owner

struct Post {
       uint timestamp;
       string message;
       address _owner;
   }

引用自:https://ethereum.stackexchange.com/questions/37605