Проблемы Web3 Rinkeby Infura

У меня есть смарт-контракт, который отлично работает при развертывании localhost: 8545(с использованием Ganache) с моим Web3Dapp. Но когда я его надеваю Rinkeby, у меня возникают проблемы.

Контракт очень прост: все, что он делает, это позволяет вам установить и получить значение 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()функция работает, но моя incrementX()функция установки выдает мне ошибки:

ошибка аккаунта

Это в основном не выбирает мой адрес.

ПРИМЕЧАНИЕ. Эта проблема возникла еще ДОMetamask обновления от 6 ноября 2018 г.

Вот как я настраиваю 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-интерфейс

Ответы (1)

Инфура не сохраняет ваши ключи. Когда вы были подключены к вашему локальному узлу, это работало, так как ваш локальный узел имеет ваши учетные записи. Вам необходимо настроить учетную запись вручную, загрузив ключи. Причина, почему это getXработает, заключается в том, что функция является просмотром и может выполняться в узлах Infura без отправки транзакции. incrementXизменить состояние контракта, и поэтому вам необходимо отправить транзакцию.

Я рекомендую использовать менеджер ключей, такой как Metamask, наоборот, вам нужно будет открыть свои ключи для подписи транзакций.

ОК, но я использую Metamask. В настоящее время я вошел в тестовую сеть Rinkeby через свою метамаску (используя Chrome). Разве это не то, что я должен делать?
Metamask не внедряет web3, поэтому у вас: ""1. НИКАКОЙ провайдер Web3 не найден! Собираюсь установить..." в консоли. Убедитесь, что метамаска разблокирована.
просто чтобы убедиться, когда вы говорите «Проверьте, что метамаска разблокирована», вы имеете в виду, что я вошел в свою учетную запись? Или есть какая-то другая "разблокировка", которую я должен сделать, о которой я не знаю?
Я начинаю задаваться вопросом, является ли проверка на MetaMaskвнедрение асинхронным типом события. Потому что каждый раз, когда я проверял это, я БЫЛ вошел в систему MetaMask, но он явно не распознавал этот факт, и он немедленно переходит к elseчасти моей логики и пытается пройти через infura...
просто войти в свой аккаунт. Проверьте новый предлагаемый метод входа в систему после 2 ноября здесь.
глядя в него...
все еще не работает...
что ты сделал?. Учтите, что ваш html должен обслуживаться сервером для работы метамаски. просто открытие вашего html-файла не поможет.