No se detecta Web3 - extensión de Google Chrome

Estoy trabajando en una extensión de Google Chrome que funciona cuando un usuario abre una nueva pestaña. Al abrir una nueva pestaña, mi dapp debería conectarse al proveedor web3 del usuario. Sin embargo, no se detecta web3.

Todo funciona bien si se implementa como una página web simple.

Me encuentro con dicho problema cuando trato de operar mi dapp como una extensión de Chrome, y comienza a ejecutarse al abrir una nueva pestaña.

Aquí está truffle-reactla configuración que no edité para recuperar web3:

let getWeb3 = new Promise(function(resolve, reject) {
// Wait for loading completion to avoid race conditions with web3 
injection timing.
window.addEventListener('load', function() {
var results
var web3 = window.web3

// 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)

  results = {
    web3: web3
  }

  console.log('Injected web3 detected.');

  resolve(results)
} else {
  // Fallback to localhost if no web3 injection. We've configured this to
  // use the development console's port by default.
  var provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545')

  web3 = new Web3(provider)

  results = {
    web3: web3
  }

  console.log('No web3 instance injected, using Local web3.');

  resolve(results)
}
})
})
¿Se está ejecutando su nodo local con el puerto rpc 9545 y la API web3 expuesta?
sí, tengo mi rpc configurado para el puerto 9545. Sin embargo, pensé que esto no importaba considerando que lo estaba ejecutando a través de infura
Pero en la lógica dada aquí, cuando no se encuentra el objeto web3, recurre a localhost, ¿no hay ningún enlace a infura api aquí?
Reemplacé el enlace localhost con mi enlace infura. Eliminé la llamada de contrato inteligente y ahora no hay errores. Sin embargo, todavía me encuentro con un No web3 instance injected, using Local web3.registro de la consola.
He tratado de responder a esta pregunta paso a paso. después de reemplazar el enlace localhost con el enlace infura, funcionará, solo la salida de la consola es ambigua.
¿Dónde se está ejecutando su código? MetaMask solo inyecta web3en http://y https://páginas. Si este código se ejecuta en una secuencia de comandos en segundo plano o en una secuencia de comandos de contenido, entonces MetaMask no se inyectará weben lo windowque puede ver su secuencia de comandos (ya que estas secuencias de comandos se ejecutan en un chrome-extension://contexto). web3solo será visible desde los scripts inyectados en la página.

Respuestas (1)

Este código verifica la verificación, por ejemplo, que ya está disponible en la ventana

var web3 = window.web3

Si lo encuentra, busque Mist/Metamask o cualquier otro proveedor, y devuelva web3 y las salidas de la consola a 'Web3 inyectado detectado'.

// Use Mist/MetaMask's provider.
  web3 = new Web3(web3.currentProvider)

  results = {
    web3: web3
  }

  console.log('Injected web3 detected.');

de lo contrario, si no se encuentra la instancia web3, este código recurre al proveedor de web3 del nodo localhost, por lo que la salida de la consola es 'No se inyectó ninguna instancia web3, usando Web3 local'.

// Fallback to localhost if no web3 injection. We've configured this to
  // use the development console's port by default.
  var provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545')

  web3 = new Web3(provider)

  results = {
    web3: web3
  }

  console.log('No web3 instance injected, using Local web3.');

Como en su caso, no está ejecutando el nodo ethereum local , está arrojando un error.

Pero como lo sugerí, ha reemplazado el enlace localhost con el enlace infura.

Ahora no hay ningún error. ¿Por qué? porque se ha inyectado web3.

Pero aún así la salida de la consola es la misma, es porque el comando de la consola sigue siendo el mismo.

 console.log('No web3 instance injected, using Local web3.');

Para verificar si web3 ha sido instanciado e inyectado, simplemente verifique la versión de web3

console.log(web3.version.api) // for web3 0.2x.x

o

console.log(web3.version) // for web3 1.0