#blockchain #solidity #truffle #metamask
Вопрос:
У меня возникли некоторые проблемы с определением и подключением к правильной сети MetaMask.
В Ganache мой сервер RPC-127.0.0.1.7545, а идентификатор сети-5777. Однако, когда я пытаюсь создать пользовательский RPC в MetaMask с этой информацией, я получаю следующую ошибку:
The endpoint returned a different chain ID: 1337
Это мое truffle-config.js:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*" // Match any network id
},
develop: {
port: 8545
}
}
};
Я надеюсь, что это будет соответствовать любому сетевому идентификатору, как я указал, но консоль показывает следующую ошибку:
Contract has not been deployed to detected network (network/artifact mismatch)
Я уже пытался truffle migrate --reset
, но безуспешно. Я также попытался создать явную сеть для testrpc в truffle-config.js — это тоже не сработало.
Любая помощь будет очень признательна!
Ответ №1:
Вы видите эту ошибку, потому что ваш контракт развернут в Ganache, но вы подключены к другой сети.
Код, который вы пишете для загрузки контракта, должен находиться внутри try/catch
блока.
внутренняя логика загрузки контракта:
export const loadContract = async (name, provider) => {
// Load the contract
// set the provider
let deployedContract = null;
try {
// Get the contract
deployedContract = await _contract.deployed();
} catch {
console.error("You are connected to the wrong network");
}
return deployedContract;
};
В компоненте , который вы используете loadContract
, вызовите его внутри useEffect
.
useEffect(() => {
// Detect Provider
if (provider) {
// contract should be loaded when provider exists
const contract = await loadContract("ContractName", provider);
rLoaded: true,
// Add More logic
} else {
console.error("Please, install Metamask.");
}
};
}, []);
Теперь вам нужно убедиться, что если вы не подключены к Ganache, отключите кнопку, чтобы ваше приложение не вышло из строя. для этого создайте переменную состояния
// You probably already have logic to get account and contract
const canConnectToContract = account amp;amp; contract;
теперь напишите правильный пользовательский интерфейс:
{!canConnectToContract amp;amp; (
<h2>Connect to Ganache</h2>
)}
<button
disabled={!canConnectToContract}
>
Donate 1 Ethreum
</button>