¿Por qué Ganache se comportaría de manera diferente dependiendo de geth, web3j, web3js y web3.py?

Tengo un token de contrato inteligente implementado en una instancia de Ganache. Mi dapp escrito con React y web3.js muestra las mismas 10 cuentas para eth.accountsejecutar el mismo comando en la consola geth.

Si creo mi objeto token con la dirección de contrato y abi en geth, obtengo un saldo diferente accounts[0]al saldo que obtengo con mi dapp. Ambos crean el objeto token con la misma dirección de cadena de bloques. ¡ Ambos muestran que eth.accounts[0]es la misma dirección!

También tengo una aplicación de Android usando web3j. Utiliza la misma dirección de contrato y muestra los mismos valores que muestra la aplicación React.

Sin embargo, también tengo una aplicación en web3.py y muestra los mismos valores que se muestran en geth.

¿Puede alguien explicarme cómo el mismo objeto token podría mostrar diferentes salidas .balanceOf("the_same_address")si está en la misma cadena de bloques? La única diferencia es si estoy usando geth, web3j, web3.js o web3.py

EDITAR: navegador de imágenes ob agregado con consola (dapp) y consola de terminal (geth)ingrese la descripción de la imagen aquí

Me da diferentes saldos para todas las cuentas. Se siente como si me estuviera conectando a 2 cadenas de bloques diferentes. Sin embargo, tienen las mismas 10 cuentas predeterminadas y mis contratos implementados en las mismas direcciones.

Cuando dices que los saldos son "diferentes", ¿quieres decir que uno es 0?
No. Los saldos son números completamente diferentes. También obtengo resultados diferentes cuando verifico las asignaciones en un contrato. Web3.js devolverá un mapeo diferente al de la consola geth.
¿Puede mostrar los saldos como números enteros antes de cambiar los decimales? La diferencia parece demasiado grande para esto, pero tal vez sea algún tipo de error de redondeo. Además, si existe la posibilidad de que esté conectado a dos cadenas diferentes, la mejor manera de confirmar que está en la misma es comparando el hash de bloque más reciente con: web3.eth.getBlock('latest').hash.
Gracias @carver Realmente esperaba que esto mostrara dos hashes diferentes. Desafortunadamente, mostró el mismo hash en geth y dapp a pesar de que muestran diferentes saldos. Creamos una nueva instancia y muestra los mismos saldos en todas las aplicaciones. Todavía no he destruido esta instancia con la esperanza de entender qué salió mal.
Una ficha rota podría dar un saldo diferente dependiendo de quién estaba llamando. (y los diferentes web3 pueden tener diferentes remitentes predeterminados) ¿Puedes agregar la solidez para verificar que no haya ningún asunto divertido en esa función?
¡También me gustaría llegar al fondo! Todas estas interfaces web3 finalmente se conectan a través de json-rpc, así que repitamos la misma llamada a través de json-rpc:curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to": "<contract_addr>", "data":"0x70a082310000000000000000000000000<non-0x-prefixed-address-to-check-balance-of-here>"}],"id":1}' 127.0.0.1:8545

Respuestas (1)

¿Los resultados se muestran en valores 'eth' y no en 'wei's? ¿Puede mostrarnos los diferentes resultados que ve en geth/ web3j/ js/ py?

Está en Wei's. Puedo convertir de wei y no es un problema de redondeo. He agregado una imagen a la pregunta.
En su consola, está escribiendo coin.balanceOf(). ¿Es 'moneda' su contrato? ¿Está llamando al mismo contrato de 'moneda' a través de web3js (IU donde muestra 599999400)? Supongo que el saldo que obtiene en la interfaz de usuario es el saldo real de la cuenta de su red blockchain y coin.balanceOf es el saldo de la dirección en su contrato. ¿Puede publicar su función coin.balanceOf aquí?
Sí, 'moneda' es el contrato con la misma dirección. balanceOf.call(cuentas[0]) en React coin.balanceOf(eth.cuentas[0]) en geth Puedes ver en la imagen que cuentas[0] es el mismo para ambos. Realmente es súper raro. Se siente como 2 cadenas de bloques diferentes, pero ambas viven en el mismo punto final y puerto...