Truffle
Metamask 和直接連接到 testrpc 之間的行為差異
我猜這個問題有一個明顯的答案,但我完全沒有抓住重點。我有一個非常簡單的契約,其中包含 2 個函式:一個更改一堆欄位的 setter,以及一個返回這些欄位的常量 getter。我有一個使用 truffle-contract 與該合約互動的 javascript 應用程序。在幕後,我的合約被部署到 testrpc。當我送出表單時,我正在呼叫我的 setter,然後在 then 塊中,我正在呼叫我的 getter 來更新頁面。我假設,如文件中所述,只有在交易被探勘後才會執行 then 塊。現在,當我在禁用 Metamask 的瀏覽器中執行我的應用程序時,使用 web3 直接連接到我的節點,一切正常,無需刷新頁面即可在事務發送後查看結果。但是使用 Metamask,一旦我點擊送出,對 getter 的呼叫沒有檢索到任何內容,我必須重新載入頁面並再次觸發 getter 以獲取數據。那是因為 testrpc 的行為有問題嗎?這會給任何人敲響警鐘嗎?
這是契約:
pragma solidity ^0.4.11; contract ChainList { // State variables address seller; string name; string description; uint256 price; // sell an article function sellArticle(string _name, string _description, uint256 _price) public { seller = msg.sender; name = _name; description = _description; price = _price; } // get the article function getArticle() public constant returns ( address _seller, string _name, string _description, uint256 _price) { return(seller, name, description, price); } }
這是呼叫它的 JS 程式碼:
App.contracts.ChainList.deployed().then(function(instance) { return instance.sellArticle(_article_name, _description, _price, { from: App.account, gas: 500000 }); }).then(function(result) { console.log("reloading articles"); console.log("result:", result); App.reloadArticles(); }).catch(function(err) { console.error(err); });
如果你在javascript中嘗試這樣的事情?(每個狀態變數)
contract.statevariable(function(err, result) { $("#htmlelement").html(result); });
可能是您的 MetaMask 未連接到您的 TestRPC 實例。當您打開 MetaMask 時,您必須點擊左上角的“提供者菜單”,其中顯示“乙太坊主網路”並選擇“Localhost 8545”,或者如果您以不同方式配置了 TestRPC,則選擇“自定義 RPC”。