Я новый ученик. Я не понимаю, как заставить web3.js работать на общем хостинге. У пользователя, использующего эту функцию, должен быть установлен Metamask.
Поскольку я использую виртуальный хостинг, я не могу установить узел или geth на виртуальный хостинг.
Я скачал web3.js с https://github.com/ethereum/web3.js/ и загрузил файлы на виртуальный хостинг, а затем связал их с файлом HTML.
<script src="assert/dist/web3.js></script>
Я следую руководству в этом посте. Можно ли использовать методы API web3.js для взаимодействия с контрактом, развернутым на Rinkeby?
и добавьте код в тег
Я использую домен с https://
Я использую браузер Google Chrome.
Я установил Metamask и вошел в систему, подключившись к тестовой сети Rinkeby.
Я загружаю следующий файл HTML на сервер общего хостинга и запускаю его, но получаю ошибку
Ниже приведен полный HTML-код, который я использовал для тестирования.
<!doctype>
<html>
<head>
<meta charset="UTF-8">
<title>Hello Project</title>
<script src="assets/dist/web3.js"></script>
<script>
var Web3 = require('web3');
var web3 = window.web3;
if(typeof web3 !== 'undefined') {
console.log("Using web3 detected from external source like Metamask");
web3 = new Web3(web3.currentProvider);
} else {
console.log("Using localhost");
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
var account = web3.eth.accounts[0];
console.log(account);
</script>
</head>
<body><p>Hello Project</p></body>
</html>
HTML web3.js не может определить тестовую сеть Ринкеби в качестве поставщика.
Что я пропустил? Советы очень ценятся. Спасибо
Основная проблема здесь заключается в том, что вы указываете узел localhost:8545
, который должен соответствовать локальному узлу на вашем компьютере.
Если у вашего пользователя есть метамаска, вам не нужно создавать экземпляр объекта Web3 самостоятельно, Metamask уже делает это, внедряя в ваш браузер экземпляр web3 в файле window.web3
. Затем Metamask будет перехватывать транзакции при использовании этого экземпляра для совершения вызовов и будет полагаться на транзакцию, если она принята пользователем, в текущей подключенной сети.
Я предполагаю, что у вас установлен и запущен MetaMask в браузере, который вы используете для тестирования.
Если это так, то трудно сказать с уверенностью, но я предполагаю, что вы проверяете window.web3
слишком рано (до того, как MetaMask сможет внедрить его).
Я бы дождался события загрузки окна, прежде чем искать window.web3
.
Спасибо, smarx и Asone за совет. Теперь у меня это работает, используя следующий код:
.
<html>
<head>
<title>Hello Project</title>
<script src="assets/dist/web3.js"></script>
</head>
<body>
<p>Hello Project</p>
<div id="err_msg_box"></div>
<script>
window.onload = function(){
if (typeof web3 === 'undefined'} {
$('#err_msg_box').html('You need <a href="htps://metamask.io">MetaMask</a> browser plugin to run this example');
} else {
// Here the code to execute the project
// No need to set Provider, use web3.eth directly
// web3.eth.getAccounts(function(err,res){ console.log(res);});
}
}
</script>
<script src="assets/js/jquery-1.10.2.min.js"></script>
</body>
</html>
в http провайдере вы можете использовать infura.io - они предоставляют доступ к виртуальной машине ethereum, вам просто нужно зарегистрироваться там и получить ключи URL
Дэвид Эвони