Solidity
從啟動控制台呼叫合約的實例函式
我正在關注本教程。我在 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]
.
- 移除
isOwner()
修飾符或者
- 啟動合約並發送
accounts[1]
參數。或者
- 添加多個所有者
這就是這個修飾符的用途,它限制其他地址呼叫它們不應該呼叫的函式。
在您的特定情況下,我建議將地址
_owner
直接添加到您的 structPost
。當您只需要檢索特定帳戶的文章時,您只需按 過濾它們post._owner
。struct Post { uint timestamp; string message; address _owner; }