¿Cómo estar seguro de la conexión "MetaMask web3 Provider"?

Nota: Esta pregunta está relacionada con esto: "Actualizado:" ¿Cómo ver la "salida" de "web3.personal.sign" en el "navegador"? ("Método personal_sign no compatible")

Hago los siguientes pasos para firmar un mensaje usando web3.personal.sign. Sin embargo, no debo hacerlo MetaMask. (Nota: aparentemente, web3.personal.signno es compatible con testRPC). Estos son los pasos que hago:

(1) abro cmdy ejecutotestrpc

(2) Hago clic en MetaMaskel icono y seleccionolocalhost 8545

(3) Selecciono uno de los private keysgenerados portestrpc

(4) Selecciono import accounty MetaMaskpego esto private keyen el cuadro de texto dePaste your private key string here

(5) ahora el saldo de esta dirección es100 eth

(6) Inserto esta dirección (clave pública) en web3.personal.signfunción de firmar el mensaje (consulte el código completo a continuación)

(7) Abro htmlexpediente porGoogle Chrome

(8) Recibo estos mensajes : No web3? You should consider trying MetaMask!y Error: Method personal_sign not supported. Aquí está la captura de pantalla: https://ibb.co/i93oRy

Aquí está el código completo para firmar un mensaje usando web3.personal.sign:

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <title>EthereumJS - Browser Example</title>
</head>

<body>
  <script src="https://rawgit.com/ethereumjs/browser-builds/master/dist/ethereumjs-abi/ethereumjs-abi-0.6.5.js"></script> 
  <script src="https://rawgit.com/ethereum/web3.js/develop/dist/web3.js"></script> 
  <script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>

  <script>

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

   // Checking if Web3 has been injected by the browser (Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    // Use Mist/MetaMask's provider
    web3 = new Web3(web3.currentProvider);
  } else {
    console.log('No web3? You should consider trying MetaMask!')
    // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
    web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
  }

//  var Web3 
//  web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

  function constructPaymentMessage(contractAddress, amount) 
  {
  return ethereumjs.ABI.soliditySHA3(
    ["address", "uint256"],
    [contractAddress, amount],
  );
  }

  var message = constructPaymentMessage("message to be signed", 100);
  console.log(message);

  web3.personal.sign("0x" + message.toString("hex"), "0x01e7D1D50804fDc2fD5A134081076A8E487Ca747", function(err, signature) {
  console.log(signature);
  console.log(err);
  // Be sure to make use of the signature only here.
  // It will not be defined until this callback is invoked.
});

}) 
  </script>
</body>
</html>

Aparentemente, no estoy conectado MetaMasky, de ser así, ¿cómo puedo solucionar este problema?

Aquí hay una captura de pantalla de MetaMaskcuando se abre y se conecta localhost 8545(como puede ver, el saldo de la testRPCdirección es 100 eth):

ingrese la descripción de la imagen aquí

Muéstranos una captura de pantalla de tu extensión Metamask abierta y conectada a la red
Cuando vas a esta página usando Chrome, ¿qué dice tu consola?
Captura de pantalla de @Shawn Tabrizi Web3 Detected! MetamaskInpageProvider: ibb.co/gZfwDd

Respuestas (1)

Se requiere un servidor web para que Metamask interactúe con su página web:

Http(s) - Servidor web requerido

Debido a las restricciones de seguridad del navegador, no podemos comunicarnos con dapps que se ejecutan en file://. Utilice un servidor local para el desarrollo.

Implemente su página en un servidor local para detectar Metamask.

Sí aparentemente. Esta respuesta ethereum.stackexchange.com/a/46400/23024 también dice esto. Sin embargo, también sugiere usar https://mainnet.infura.io/<APIKEY>en lugar de localhost 8545si ejecuto mi página localmente. Entonces, ¿puedo usar "https://mainnet.infura.io/noapikey"eso que se usa en la página que compartiste? Gracias
también si me conecto a Ropstenby Paritypero lo uso localhost 8545en mi htmlarchivo, ¿funciona? Gracias
El problema es que si usa infura como su conexión a la red, no tendrá una "cuenta" cargada con su proveedor web3. Por supuesto, puede poner su clave privada y otras cosas dentro de su código para que pueda usar su cuenta, pero generalmente es mejor usar algo como Metamask. Infura es un buen reemplazo si simplemente está realizando operaciones de lectura.
Gracias, así que en este caso, tengo que usar ex. Paritypara conectarse a ej. Ropsteny luego use web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));en la parte superior del JavaScriptcódigo y ejecute este JSarchivo usando node filename.js? ¿Hay alguna forma mejor? Gracias