Truffle

Metamask 和直接連接到 testrpc 之間的行為差異

  • August 17, 2017

我猜這個問題有一個明顯的答案,但我完全沒有抓住重點。我有一個非常簡單的契約,其中包含 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”。

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