У меня есть смарт-контракт, который отлично работает при развертывании localhost: 8545
(с использованием Ganache
) с моим Web3
Dapp. Но когда я его надеваю 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
я развернул его в Rinkeby
TestNet (через 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
- что, я думаю, является настоящей проблемой здесь:
А вот краткий скриншот того, как выглядит интерфейс приложения:
Инфура не сохраняет ваши ключи. Когда вы были подключены к вашему локальному узлу, это работало, так как ваш локальный узел имеет ваши учетные записи. Вам необходимо настроить учетную запись вручную, загрузив ключи. Причина, почему это getX
работает, заключается в том, что функция является просмотром и может выполняться в узлах Infura без отправки транзакции. incrementX
изменить состояние контракта, и поэтому вам необходимо отправить транзакцию.
Я рекомендую использовать менеджер ключей, такой как Metamask, наоборот, вам нужно будет открыть свои ключи для подписи транзакций.
Марк55
Хайме
Марк55
Марк55
MetaMask
внедрение асинхронным типом события. Потому что каждый раз, когда я проверял это, я БЫЛ вошел в системуMetaMask
, но он явно не распознавал этот факт, и он немедленно переходит кelse
части моей логики и пытается пройти черезinfura
...Хайме
Марк55
Марк55
Хайме