Solidity

Web3 Rinkeby Infura 問題

  • November 7, 2018

我有一個智能合約,當部署到localhost: 8545(使用Ganache)我的Web3Dapp 時,它可以完美執行。但是當我戴上它時Rinkeby,我遇到了問題。

Contract 非常簡單:它所做的只是讓你設置和獲取值uint變數x

pragma solidity ^0.4.16; 


contract Incrementor { 

   uint x; 


   constructor() public { 
      // Give x in initial value of 10:
      x = 10; 
   } 


   function getX() external view returns (uint xValue) { 
       return (x); 
   } 


   function incrementX(uint byThisMuch) public { 
       x += byThisMuch; 
   } 


}

在成功執行它之後,localhost: 8545我現在已經將它部署到了RinkebyTestNet(通過Remix)並Infura用來連接它——但我突然在那裡遇到了不一致的行為。具體來說,我的getX()函式有效,但我的 setterincrementX()函式給了我錯誤:

帳戶錯誤

它基本上沒有選擇我的地址。

注意:這個問題甚至在2018 年 11 月 6 日更新之前就已經發生Metamask

這是我在我的設置Web3中的方式HTML

if(typeof(web3) !== 'undefined') {
           console.log("Web3 provider found! Current Provider is WORKING!");
           web3 = new Web3(web3.currentProvider);
       }
       else {
           console.log("1. NO Web3 provider found!  Gonna set one up...");

           // Connect to Infura:
           web3 = new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/<MY API KEY"));

           // Or use this when connecting to `localhost`:
           // web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));


           console.log("2. OK, NOW we DO have a PROVIDER --> HttpProvider = ", web3.providers.HttpProvider);

           web3.eth.defaultAccount = web3.eth.accounts;
           console.log("3. ALL ACCOUNT - web3.eth.accounts = ", web3.eth.accounts);
           console.log("4. web3.eth.defaultAccount = ", web3.eth.defaultAccount);

           // Also tried with 'getAccounts' (same as `.accounts` - but asynchronous)
           console.log("5. web3.eth.getAccounts() ==> ", web3.eth.getAccounts());

           web3.eth.getAccounts(function(error, result) { 
               if(error != null)
                   console.log("7. Error! ", error);
               else
                   console.log("7. Result = ", result);
           });

           console.log("Exiting the WEB3 JAM!");

       };

同樣,請參閱上面的控制台日誌以查看發生了什麼。

奇怪的是,我確實在連接智能合約並與之交談Rinkeby——我知道這一點是因為我的getX()按鈕點擊操作返回了正確的值:

吸氣劑

但是當我嘗試設置它時 -那就是我得到那個錯誤的時候。

真的,更多的是關於我的地址不斷返回的事實undefined——我認為這是真正的問題:

這是應用程序界面的快速螢幕截圖:

DAPP介面

Infura 不保存您的密鑰。當您連接到本地節點時,這是因為您的本地節點有您的帳戶。您需要通過載入密鑰來手動設置您的帳戶。之所以getX有效,是因為該功能是視圖,可以在 Infura 節點中執行而無需發送交易。incrementX更改合約狀態,因此您需要送出交易。

我推薦使用像 Metamask 這樣的密鑰管理器,相反,你需要公開你的密鑰來簽署交易。

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