alastria / alastria-node

How to install a node in Alastria Red-T (Quorum technology) and tips to deploy and use it
https://alastria.io/
Apache License 2.0
81 stars 299 forks source link

Problema para hacer transacción firmada privada desde nodejs a un nodo regular con la cuenta bloqueada #313

Closed go2chain closed 5 years ago

go2chain commented 6 years ago

Buenos días, no estoy seguro de que este sea el canal apropiado, de no ser así por favor decirme a cual me debo dirigir. Tengo una pregunta relacionada con la conexión a mi nodo regular. En el caso en el que yo tenga desplegado un nodo regular y en el cree un SmartContract que para facilitar simplemente tenga un Get y un Set, como puedo hacer para conectarme e interactuar con el vía un servidor de Nodejs. Normalmente cuando he trabajado con redes de geth privadas pero que no fueran de Quorum lo que hacía era firmar la transacción antes de enviarla y mediante el método de Web3js sendSignedTransaction envíarlo. El problema está que en este caso quiero hacer uso de los contratos privados que nos proporciona Quorum y para ello incluyo en la creación de la transacción con la librería ethereum-tx la propiedad privateFor pero al enviarlo a mi nodo no está actualizando correctamente el valor del Smart Contract. En el caso de hacer un Smart Contract público y no utilizar la propiedad privateFor todo funciona correctamente. Pero como puedo hacer para mandar una transacción firmada con mi clave privada (y de esta forma tener “lock” mi account en el nodo regular) y no tener la necesidad de estar todo el rato haciendo un unlockAccount y lockAccount constantemente? Muchas gracias

netmanito commented 5 years ago

Buenos días,

¿Puedes enviarnos más datos del problema que os ocurre, logs, mensajes de error, contrato, ..?

Para el tema de webj3, existe una version webjs para quorum http://npm.taobao.org/package/web3-quorum que puedes probar.

El tema de hacer lock y unlock, puedes utilizar el unlock temporal --unlock 0/180/360/3600 para realizar la transacción. La aplicación Constellation obliga ha hacer unlock de la cuenta para realizar la operación, así que en este caso necesitas desbloquearla para lanzar la transacción y luego puedes volver a bloquearla.

Gracias y saludos.

IvanSaizIOB commented 5 years ago

Hola @go2chain, ¿conseguiste trabajar con contratos privados? Como indicaba @netmanito con Constellation es obligatorio hacer unlock de la cuenta para realizar transacciones privadas. ¿De esta forma te funciona correctamente? Gracias

go2chain commented 5 years ago

Buenas! Como comentaba @netmanito existe la librería y le habíamos echado un vistazo. El problema es que esa librería te da funcionalidades referentes a la interacción con el nodo, como por ejemplo poder consultar el .nodeInfo

En nuestro caso, lo que necesitabamos era la forma de poder mandar transacciones firmadas con nuestra clave privada y que pudieramos añadirle la propiedad privateFor[] en el objeto de la transaccion. Aún no hemos conseguido realizarlo ni sabemos bien como poder hacerlo.

Lo que si hemos conseguido es realizar transacciones privadas haciendo un unlock y un lock posteriormente de nuestra account, aunque no es la solución que queríamos.

Actualmente nos encontramos con dos dudas:

1º Como podemos saber si nuestro nodo tiene configurado correctamente el constellation. Hemos realizado un update y un restart de nuestro nodo pero al fijarnos en los logs del constellation este intenta constantemente conectarse con el resto de nodos constellation (con el https correctamente indicado) pero nos devuelven todo el rato errores como los siguientes:

(InternalException (HostCannotConnect "169.60.149.188" [Network.Socket.connect: <socket: 17>: does not exist (Connection refused)])) 11:38:31 [WARN] Synchronization failed: HttpExceptionRequest Request { host = "87.253.228.23" port = 9000 secure = True requestHeaders = [] path = "/partyinfo" queryString = "" method = "POST" proxy = Nothing rawBody = False redirectCount = 10 responseTimeout = ResponseTimeoutDefault requestVersion = HTTP/1.1 } (InternalException (HostCannotConnect "87.253.228.23" [Network.Socket.connect: <socket: 17>: does not exist (Connection refused)])) 11:38:31 [WARN] Synchronization failed: HttpExceptionRequest Request { host = "23.102.47.3" port = 9000 secure = True requestHeaders = [] path = "/partyinfo" queryString = "" method = "POST" proxy = Nothing rawBody = False redirectCount = 10 responseTimeout = ResponseTimeoutDefault requestVersion = HTTP/1.1 } (InternalException (HandshakeFailed (Error_Protocol ("certificate rejected: [NameMismatch \"23.102.47.3\",LeafNotV3]",True,CertificateUnknown)))) 11:38:31 [WARN] Synchronization failed: HttpExceptionRequest Request { host = "130.206.64.6" port = 9000 secure = True requestHeaders = [] path = "/partyinfo" queryString = "" method = "POST" proxy = Nothing rawBody = False redirectCount = 10 responseTimeout = ResponseTimeoutDefault requestVersion = HTTP/1.1 } (InternalException (HostCannotConnect "130.206.64.6" [Network.Socket.connect: <socket: 17>: does not exist (Connection refused)])) 11:38:31 [WARN] Synchronization failed: HttpExceptionRequest Request { host = "90.68.122.84" port = 9000 secure = True requestHeaders = [] path = "/partyinfo" queryString = "" method = "POST" proxy = Nothing rawBody = False redirectCount = 10 responseTimeout = ResponseTimeoutDefault requestVersion = HTTP/1.1 } (InternalException (HostCannotConnect "90.68.122.84" [Network.Socket.connect: <socket: 17>: does not exist (No route to host)])) 11:38:32 [INFO] Starting synchronization with https://10.80.1.117:9000/ 11:38:32 [INFO] Starting synchronization with https://18.221.246.168:9000/ 11:39:02 [INFO] Starting synchronization with https://213.99.45.240:9000/ 11:39:32 [INFO] Starting synchronization with https://35.180.155.54:9000/ 11:39:32 [INFO] Starting synchronization with https://89.40.139.180:9000/ 11:39:32 [INFO] Starting synchronization with https://194.69.249.210:9000/ 11:39:32 [INFO] Starting synchronization with https://34.246.45.100:9000/ 11:39:32 [INFO] Starting synchronization with https://40.118.64.233:9000/ 11:39:32 [INFO] Starting synchronization with https://83.61.8.118:9000/ 11:40:02 [INFO] Starting synchronization with https://54.72.78.171:9000/ 11:40:32 [INFO] Starting synchronization with https://35.240.124.210:9000/

2º Nos acabamos de dar cuenta que habéis subido en la wiki una guía para realizar transacciones privadas: https://github.com/alastria/alastria-node/wiki/private_transactions_in_alastria

En la guía se muestra como se puede desplegar un contrato privado entre dos nodos de la red mediante truffle. En nuestro caso estamos recibiendo un error (el mismo que en esta issue) #301 y no entendemos que es lo que pasa.

Por otro lado, en la misma guía también se indica:

REMEMBER that you can't send private transactions from and to your selfnode.

Sin embargo, nosotros hemos desplegado un contrato con la parámetro privateFor[] vacío y solo es visible para nuestro nodo. No podemos crear un contrato privado al que solo podamos acceder nosotros?

Muchas gracias

netmanito commented 5 years ago

Hola @go2chain, intento contestar a tus dudas. 1- para comprobar si constellation está arrancado y funcionando correctamente puedes seguir estos pasos:

ethuser@xzdeth0003esdl:~/alastria$ netstat -antp |grep 9000
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      57297/constellation
tcp        0      1 10.254.32.6:59040       52.136.247.41:9000      SYN_SENT    57297/constellation
ethuser@xzdeth0003esdl:~/alastria$ curl https://localhost:9000
curl: (35) gnutls_handshake() failed: Unknown certificate

Comprueba que el puerto esté abierto y haz un curl https al puerto constellation, si está con https debería devolverte un error de certificado. Comprueba también como dice el artículo que constellation.conf tiene las direcciones en https en lugar de http. Los errores que ves en el log se producen porque no todos los nodos de la lista constellation tienen éste activo, así que cuando hace el barrido de nodos se encuentra con algunos apagados y que devuelven este error.

2- La guía de como desplegar contratos privados necesita de 2 nodos diferentes, siempre enviamos la transacción privada de un nodo a otro, nunca a nosotros mismos. Asegurate de que ambos nodos que van a hacer la transacción tienen https configurado en constellation y están activos. Sobre crear contratos privados que sólo uno mismo pueda interactuar, no hemos realizado esas pruebas con privateFor vacío. Lo que sí sabemos, es qué, si añadimos la clave del propio nodo en privateFor para hacer una transacción en el mismo nodo (interna), no funciona. También recordar que hay que desbloquear la cuenta que va a realizar la transacción antes de lanzarla. web3.personal.unlockAccount("0xe2af1c06db3d3asfdgsc65015eb536f338fe87e3aa", "Passw0rd", 15000)

Saludos

go2chain commented 5 years ago

Buenas @netmanito gracias por las respuestas.

Respecto a la primera parte sobre constellation, nos aparece exactamente igual que a vosotros así que entendemos que esta funcionando correctamente. Lo que extraña es que haya tantísimos errores en los Logs que comentábamos.

Respecto a la segunda parte de llamar con privateFor vacío aparentemente si esta funcionando y solo tengo yo posibilidad de ver el contenido del contrato, cuando llamas a privateFor va implícito por debajo que tu también formas parte de la parte privada de la transacción o contrato al ser el emisor.

Lo que nosotros seguimos sin conseguir es: -Desplegamos un contrato en la red desde nuestro nodo de forma privada con otro nodo (un contrato que solo tenga un set y un get de un string). -Desde un Nodejs (en un servidor diferente a nuestro nodo de Alastria) poder llamar a nuestro nodo para crear una transacción con la propiedad privateFor indicando la clave del otro nodo y llamar al método set de ese contrato. Esto lo estamos intentando mediante la librería web3js.

¿Este escenario entendemos que debería ser totalmente posible para las casos de uso de Alastria no? O nos estamos confundiendo en la forma de conectarnos.

Muchas gracias

netmanito commented 5 years ago

Hola @go2chain,

Hemos preguntado a JPMorgan por las trx privadas firmadas fuera del nodo (sendRawTransaction), y nos han confirmado que de momento no es posible realizar este tipo de transacciones.

Aunque están trabajando en ello para que en un futuro quorum permita realizar la operación, ahora mismo no es posible.

Gracias y saludos.

go2chain commented 5 years ago

Hola @netmanito,

Muchas gracias por la respuesta. Nos quedaremos a la espera entonces de que lo implementen. Si tenéis noticias en algún momento comentárnoslo por favor!

Un saludo

netmanito commented 5 years ago

Cerramos la incidencia ya que creemos que se han resuelto las dudas sobre los contratos privados. Si se necesita añadir alguna información, comentadlo y la reabriremos. Gracias.