¿Cómo conecto IPC con Parity?

Estoy ejecutando Parity en modo warp en Mac OSX:

paridad --warp --rpcapi "web3,eth,personal"

Luego abro una nueva terminal y ejecuto:

nodo Web3 = require("Web3") web3 = new Web3(new Web3.providers.HttpProvider(" http://localhost:8545 "))

Sin embargo, he oído que RPC no es tan seguro como IPC. ¿Es esto cierto? ¿Por qué? ¿Y cómo me conecto a través de IPC en su lugar? Sería útil alguna explicación ya que la diferencia entre IPC y RPC es un poco nebulosa para mí.

Gracias.

También está el problema de la latencia.

Respuestas (3)

El estándar RPC es un servidor web no seguro (generalmente) que se comunica a través de mensajes HTTP estándar (GET/POST/PUT/etc). Si no está protegido (y tal vez la paridad proporcione la capacidad de protegerlo con certificados de algún tipo), esto significa que cualquier persona que pueda acceder al puerto en el que está escuchando podrá controlar todas las funciones expuestas por ese RPC.

El punto final de IPC, por otro lado, es una tubería con nombre en el sistema de archivos, que está protegida a través de todos los medios normales de permisos del sistema de archivos. Esto significa que si el usuario/grupo carece de permisos para el identificador de archivo de la canalización, no podrá leerlo/escribirlo. Incluso podría configurar la canalización IPC para que sea de solo lectura para algunos usuarios y de lectura/escritura para otros.

La paridad le permite configurar la interfaz IPC a través de un archivo de configuración como mínimo, y probablemente también a través de indicadores de línea de comandos. Desde el lado web3, reemplazaría Web3.providers.HttpProvider("http://localhost:8545")con Web3.providers.IpcProvider("/path/to/ipc", net), donde netes una referencia a nodejs netlib (por ejemplo var net = require('net');).

También vale la pena señalar que Parity parece permitirle configurar la interfaz en la que escucha el RPC, lo que le permite limitarlo solo a la interfaz "local", de forma predeterminada. Esto lo acerca al nivel de seguridad (potencialmente) que ofrece el punto final de IPC, al restringir el acceso solo a los usuarios locales. Sin embargo, todavía no ofrece el nivel de control por usuario/por grupo que proporciona la interfaz IPC.

Gracias @deviatefish, esto es muy útil. Parece que 'path_to_ipc' debería vincularse al archivo ipc que se crea cuando se inicia la paridad en modo ipc.
Eso es correcto. Parece que la ubicación predeterminada es $HOME/.local/share/io.ethereum.parity/jsonrpc.ipc, pero necesitaría poder expandir la variable de entorno allí para que funcione desde el lado js.
LO SIENTO, TENGO PROBLEMAS DE EDICIÓN ¿Qué significa tu último comentario? Ejecuté (ejecutarlo con 'var' no funcionó): > net = require('net') <br/> Porque actualmente ambos de los siguientes errores están fuera > Web3.providers.IpcProvider("~/Library/Application\ Support/io.parity.ethereum/jsonrpc.ipc", net) > Web3.providers.IpcProvider("~/Library/Application Support/io.parity.ethereum /jsonrpc.ipc", red)
¿En qué tipo de sistema lo estás ejecutando? Al ejecutar la paridad, ¿existe el archivo en esa ubicación?
Estoy en Max OSX Yosemite y el archivo existe, no estoy seguro de si debo escapar del espacio en 'Aplicación \ Soporte' pero de cualquier manera no funcionó. Aquí está la respuesta parcial: Error de conexión IPC { Error: conecte ENOENT ~/Library/Application Support/io.parity.ethereum/jsonrpc.ipc en Object.exports._errnoException (util.js:1018:11) en exportaciones._exceptionWithHostPort ( util.js:1041:20) en PipeConnectWrap.afterConnect [como oncomplete] (net.js:1086:14) código: 'ENOENT', errno: 'ENOENT', syscall: 'connect', dirección: '~/Library/ Soporte de aplicaciones/io.parity.ethereum...
Eso parece implicar que no puede encontrar el archivo en esa ruta... ¿Tal vez no sabe qué hacer con el ~? En la consola, intente ir a su directorio de inicio ( cd ~) y luego obtener la ruta absoluta desde allí ( pwd)?
Oye, amigo, realmente aprecio la ayuda, pero desafortunadamente todavía no puedo hacer que funcione. Web3.providers.IpcProvider("/Users/{redacted}/Library/Application Support/io.parity.ethereum/jsonrpc.ipc", net) . El error dice indefinido . Esto es después de ejecutar net = require('net') y Web3 = require("Web3") y asegurarse de que el nodo esté sincronizado y que *jsontpc.ipc exista.
Usted mencionó que necesitaría poder expandir la variable de entorno allí para que funcione desde el lado js antes. ¿Qué significa eso exactamente?
Me refería a la $HOMEparte de la ruta predeterminada que había proporcionado. Eso generalmente se expande a /Users/<username>/OSX o /home/<username>/Linux. Parece que hiciste la expansión adecuada en tu comentario más reciente, así que no estoy seguro de qué está pasando allí. ¿Puedes poner tu código (menos cualquier cosa que necesites/quieras redactar) en esencia para que pueda verlo más de cerca? Obtener un error de undefinedes bastante inusual.
Finalmente resolví esto... fue un error estúpido, no estaba poniendo web3 = new Web3(etcetcetc)... Vea mi nueva respuesta a continuación si está interesado. ¡Muchas gracias por su ayuda, probablemente escuchará más de mí mientras trato de entender el EVM y Web3!

En nodejs, ubuntu 16.04, instalación predeterminada de Parity:

var net = require('net')
var web3 = require('web3')

ipcPath = process.env["HOME"] + "/.local/share/io.parity.ethereum/jsonrpc.ipc"
provider = new web3.providers.IpcProvider(this.ipcPath, net)

Finalmente resolví este problema. Después de ejecutar la paridad, ejecuta el nodo con las siguientes declaraciones:

Web3 = requerir("Web3")

red = requerir ('red')

web3 = new Web3(Web3.providers.IpcProvider("/Users/{redacted}/Library/Application\ Support/io.parity.ethereum/jsonrpc.ipc",net));

Antes simplemente estaba ejecutando Web3.providers.IpcProvider("/Users/{redacted}/Library/Application\ Support/io.parity.ethereum/jsonrpc.ipc",net) sin anidarlo dentro de web3 = new Web3(

@deviatefish Desafortunadamente, todavía no puedo hacer que esto funcione, el proveedor aún no está definido. ¿Quizás le falta un número de puerto?
No debería requerir un número de puerto. ¿ Quizás intentarlo web3 = new Web3(new Web3.providers.IpcProvider("/Users/{redacted}/Library/Application\ Support/io.parity.ethereum/jsonrpc.ipc",net));? Tenga en cuenta la newpalabra clave al crear el proveedor. También deberá asegurarse de que la paridad realmente proporcione la canalización de IPC.