[Ethereum] Using Truffle, Metamask and Ropsten to simulate two users

metamaskropstentruffle

I'm trying to create an environment where I can test that access to a contract is restricted to a given wallet address, so I'm trying to simulate two users…

1) I'm running geth pointing to Ropsten test network, and have deployed a simple contract with Truffle, which I'm accessing locally via "truffle serve" at http://localhost:8080

2) I have two Chrome instances, "Person 1" and "Person 2" with Metamask wallets set to a separate account in each, both accounts are Ropsten accounts, created in my geth console.

3) When I point the Metamask wallets to the Ropsten network, I can successfully send transactions from each account to my contract and see the values in Ropsten via the etherscan browser, but – I can't successfully make any calls to "constant" functions, everything just returns a zero or a null (ie. in code below I can set the string, but not read it).

I think I'm on the right lines, but don't understand why my calls are not returning any data – anyone encountered similar, or have a good alternative solution to simulate two users?

[UPDATE: My scenario works if I use testrpc instead of Ropsten, so question remains – why can't I make a call to a constant function on Ropsten? ]

Thanks,
Iain

contract Message {

    address public owner = msg.sender;
    string public message = "Initial Message";

    function Message() public {
      message = "No message set - by constructor";
      owner = msg.sender;
    }

    function retrieveMessage() constant
       returns (string _messageString)
    {
      _messageString = message;
    }

    function setMessage(string messageString) {
      message = messageString;
    }

}

Javascript running via http://localhost:8080 served by Truffle…

 import message_artifacts from '../../build/contracts/Message.json'

 // Messages is our usable abstraction, which we'll use through the code below.
 var Messages = contract(message_artifacts);

 refreshMessage: function() {
     var self = this;

     var meta;
     Messages.deployed().then(function(instance) {
        var result = instance.retrieveMessage.call();
        return result;
     }).then(function(value) {
        var message_element = document.getElementById("secretMessage");
        message_element.innerHTML = value + ".";
     }).catch(function(e) {
        self.setStatus("Error getting message; see log.");
     });
}

Best Answer

I have found a fix for my problem (and answer here for people who find this in the future) - in the Metamask window, even though I am deploying to Ropsten test network, it turns out that I need to set the network "tick" on localhost:8545 rather than on the Ropsten network directly - if I do this, then I get correct values returned.

Hope this helps someone...

Related Topic