Когда объект web3 внедряется в веб-страницу?

У меня есть приложение node.js, которое было сгенерировано генератором экспрессов. Я хочу использовать объект web3, добавленный плагином Metamask, но когда я пытаюсь открыть console.log(process.web3), он не определен. Когда я набираю window.web3 в консоли разработчика браузера, он возвращает объект web3.

Кто-нибудь знает, когда вводится объект web3 и где в экспресс-приложении я могу назначить что-то вроде

var web3 = process.web3;

3 ответа

Вы пытаетесь использовать web3.js на стороне сервера (внутри Node.js) или на стороне клиента (внутри браузера)? Похоже, вы смешиваете эти два случая.

Клиентский web3.js инициализируется, когда библиотека JS загружается браузером. Обычно, если вы используете что-то вроде $(document).ready() Вы сможете получить к нему доступ.

Серверная сторона web3.js требует неявной инициализации.

Вы пробовали следующее? Я использую это для подключения к web3, введенному метамаской.

import { default as Web3} from 'web3';

...

window.addEventListener('load', function() {

    // Checking if Web3 has been injected by the browser (Mist/MetaMask)
    if (typeof web3 !== 'undefined') {
        console.warn("Using web3 detected from external source. If you find that your accounts don't appear or you have 0 MetaCoin, ensure you've configured that source properly. If using MetaMask, see the following link. Feel free to delete this warning. :) http://truffleframework.com/tutorials/truffle-and-metamask")
        // Use Mist/MetaMask's provider
        window.web3 = new Web3(web3.currentProvider);
    } else {
        console.warn("No web3 detected. Falling back to http://127.0.0.1:8545. You should remove this fallback when you deploy live, as it's inherently insecure. Consider switching to Metamask for development. More info here: http://truffleframework.com/tutorials/truffle-and-metamask");
        // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
        window.web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"));
    }
});

Надеюсь это поможет

Для узла js вы должны включить пакет web3.

У меня проблема с этим, может кто-нибудь помочь, пожалуйста. Я не могу сделать какой-либо ориентированный на транзакции вызов метода для смарт-контракта через web3 с узла js. Я установил расширение MetaMask на Google Chrome. Но я не уверен, что дать провайдеру, так как я вызываю метод send для моего метода смарт-контракта через web3 js. Но он показывает неизвестную учетную запись для вызова этого метода. Ниже приведен код:

const Web3 = require('web3')    
var web3 = new Web3('https://testgeth.loveblock.io', net);


var candidateName = req.query.candidate;
console.log('request for :'+candidateName+" came \n")

fs.readFile(path.join(__dirname+'/../abi/mainABI.json'), 'utf8' ,(error ,data)=> {

    if (error) {
        console.log(error)
        res.end("The error is "+error);
    }

    var contract = new web3.eth.Contract(JSON.parse(data), '0x89d9cea7716adf9c5d3bf1004d7df822d823f6e0');

    contract.methods.voteForCandidate(web3.utils.asciiToHex(candidateName)).
    send({from: '0xEcB0A85b7bcD3f45Ca5368353C4AfD00A9c3A5b8'},function (error, TtansactionHash) {
        if (error) {
            console.log(error)
            res.end("The error is "+error)
        }
        else {
            totalVotes(candidateName)

Я думаю, что проблема с конечной точкой RPC, я должен использовать расширение METAMASK, но этого не происходит, пожалуйста, предоставьте любой ответ.

Ниже приведена ошибка:

Ошибка: возвращенная ошибка: неизвестный аккаунт

Обратите внимание, что если я вызываю метод totalVotes(андидат) непосредственно без voiceForCandidate(), он работает нормально, так как для этого не требуется никаких транзакций, но я не могу подключиться к объекту Metamask Web3, который уже интегрирован в браузер Chrome, и доступ к нему можно получить непосредственно из внешний интерфейс (сторона клиента).

Другие вопросы по тегам