Взаимодействие с Metamask web3. js - PullRequest
0 голосов
/ 17 февраля 2020

Я сталкиваюсь с проблемой, когда создаю контракт на своем локальном ethereum блокчейне. У меня есть базовый c контракт на регистрацию do c на блокчейне.
Итак, когда я запускаю свой контракт в трюфельной консоли, я могу безупречно вызывать все свои функции, но, когда я создаю веб-страницу с интерфейсом внешнего интерфейса, я не могу открыть метамаску для оплаты.
Мой контракт имеет в основном 2 функции: addDo c и FindDo c. Я провел тест, создавая транзакцию с использованием сайта ремикса, и она работала нормально. На моей странице я все еще могу позвонить findDo c и получить ответ с правильной информацией, но когда я пытаюсь создать транзакцию и заплатить комиссию, метамаска не показывает мне.


У меня всего 4 файла:

  • index. html
  • app. js
  • notaryWebApp. js
  • sha256

Коды можно найти здесь: https://github.com/ffelipesimoes/solidity/tree/master/webapp

Основным взаимодействием с блокчейном является нотариус WebApp. js file:

var contract = undefined;
var customProvider = undefined;
var address = "0x6A4494ed32ce0Ab8004fbEAdac534916f88C8d3E";
var abi = undefined;

function notary_init() {
    // Check if Web3 has been injected by the browser (Mist/MetaMask)
    if (typeof web3 !== 'undefined') {
        // Use existing gateway
        window.web3 = new Web3(web3.currentProvider);
    } else {
        alert("No Ethereum interface injected into browser. Read-only access");
    }
    //contract abi
    abi = [...]
    contract = new web3.eth.Contract(abi, address);
};

//sends a hash to the blockchain
function notary_send(hash, callback) {
    web3.eth.getAccounts(function (error, accounts) {
        contract.methods.addDocHash(hash).send({
            from: accounts[0]
        }, function (error, tx) {
            if (error) callback(error, null);
            else callback(null, tx);
        });
    });
};

//looks up a hash on the blockchain
function notary_find(hash, callback) {
    contract.methods.findDocHash(hash).call(function (error, result) {
        if (error) callback(error, null);
        else {
            let resultObj = {
                mineTime: new Date(result[0] * 1000),
                blockNumber: result[1]
            }
            callback(null, resultObj);
        }
    });
};

с тех пор, спасибо всем!

Ответы [ 3 ]

0 голосов
/ 17 февраля 2020

Вам необходимо использовать window.ethereum и ethereum.enable(), как описано здесь , это связано с режимом конфиденциальности , недавно введенным в MetaMask.

В вашем case, позвоните await window.ethereum.enable() до notary_init() и запустите экземпляр web3 с window.ethereum вместо currentProvider.

0 голосов
/ 18 февраля 2020

Большое спасибо. Работал так:

function notary_init() {

    // Check if Web3 has been injected by the browser (Mist/MetaMask)
    if (typeof web3 !== 'undefined') {
        // Use existing gateway
        window.web3 = new Web3(web3.currentProvider);
    } else {
        alert("No Ethereum interface injected into browser. Read-only access");
    }

    ethereum.enable()
.then(function (accounts) {
  // You now have an array of accounts!
  // Currently only ever one:
  // ['0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825']
})
.catch(function (error) {
  // Handle error. Likely the user rejected the login
  console.error(error)
})


    //contract abi
     abi =[...]
    contract = new web3.eth.Contract(abi, address);
};
0 голосов
/ 17 февраля 2020

Для решения этой проблемы предпочтительнее использовать интерфейс прямого подключения и предварительно разработанные сценарии. Вы можете найти пакет с именем Blockchain в Pypi, который может решить ваши проблемы и убедиться, что вы находитесь в нужной папке ad = nd address

...